两个经典递归问题:菲波那契数列 + 汉诺塔
一.递归问题的处理步骤
1)抽象出递归公式:对实际问题进行部分穷举,抽象出递归关系(关键),并列出“递归表达式”
2)确定递归出口:找出递归调用终止点
二.菲波那契数列
  实际问题:兔子繁殖问题
兔子在出生一个月后为成兔,两个月后就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有
  兔都不死,那么一年以后可以繁殖多少对兔子?
    1)抽象出递归公式
         初始为:1对幼兔
         第n个月    1      2       3       4      5      6      7    
         幼兔:      1      0       1       1      2      3      5
         成年兔:   0      1       1       2      3      5      8
         总计:      1      1       2       3      5      8     13
         规律:
         幼兔=前一个月成年兔
         成年兔=前一个月成年兔+前一个月幼兔
总计=幼兔+成年兔=前一个月成年兔+(前一个月成年兔+前一个月幼兔)
=前一个月成年兔+前一个月总计
=(再前一个月成年兔+再前一个月幼兔)+前一个月总计
=再前一个月总计+前一个月总计
递归表达式如下:
A(1)=A(2)=1,
               A(N)=A(N-1)+A(N-2)(N>=3)
    2)找出递归调用终止点 
               由递归表达式很明显观察出,递归终止点为3;故剩下的A(1),A(2)直接穷举出来即可
                一年后,相当于“第13个月”。
    代码如下:
1 #include<iostream> 2 using namespace std; 3 4 int Fibonacci(int X) 5 { 6 if(X==1||X==2) 7 { 8 return 1; 9 } 10 else 11 { 12 return(Fibonacci(X-1)+Fibonacci(X-2)); 13 } 14 } 15 16 int main() 17 { 18 int tempInt; 19 int returnInt; 20 21 tempInt=13; 22 returnInt=Fibonacci(tempInt); 23 24 cout<<returnInt<<endl<<endl; 25 system("pause"); 26 return 0; 27 28 }
运行结果:
      
三.汉诺塔
    http://blog.163.com/liuknan@yeah/blog/static/16983829020109892141485/
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号