递推和递归

递推和递归

递推

递推犹如斐波那契数列:f(0) = 1, f(1) = 1;

f(n) = f(n-1) + f(n-2);

1 int i = 0;
2 long fib[NUM] = {1,1};
3 f(i=0; i<NUM; i++){
4     fib[i] = fib[i-1] + fib[i-2];
5 }

注意这里只是循环没有自己调用自己。

递归犹如汉诺塔:

当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。

A塔上有三个盘子,B塔会有两个正常的盘子(当然要借助C塔),然后,将最大的盘子移到C塔,然后将盘子移动到C塔上(借助A塔)。

同理A塔上有N个盘子,B塔上有N-1个正常的盘子(借助C塔),然后,将N号盘子移动到C塔,最后将盘子移到C塔(借助A塔)。

赤裸裸的递归,先来介绍一个函数,如下所示。

hanoi(N,from,depend_on,to);//先将初始塔的前n个盘子借助目的塔移动到借用塔上  

 所以汉诺塔核心代码如下。

 1 hanoi(int n,char from, char depend_on, char to)
 2 {
 3     if(n==1)
 4         printf("%d\t %c->%c",n, from, to);
 5     else
 6         {
 7             hanoi(n-1,from, to, depend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上 
 8             printf("%d\t %c->%c",n, from, to);//将剩下的一个盘子移动到目的塔上  
 9             hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上  
10         }
11 }

自己调用自己了参见第7行和第九行。

原文地址:https://www.cnblogs.com/hellowu/p/3094982.html