1. fibonacci数列的求解

   fibonacc数列规律,前面两数值之和为后面一个数fibonacci数。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 /*
 4  * 输入:指定产生fibonacci个数
 5  * 输出:每4个数字一行输出fibonacci数 
 6  * 根据输入数列的大小,采用递归法生成fibonacci数列。
 7  */
 8 int fibonacci(int *nums,int n)
 9 {
10     int value;
11     
12     if(n == 0){
13         nums[0] = 0;
14         return 0;
15     }
16                 
17     if(n == 1){
18         nums[1] = 1;
19         return 1;
20     }
21             
22     value = fibonacci(nums,n-1) + fibonacci(nums,n-2);
23     nums[n] = value;
24     return value;
25 }
26 
27 int main(int argc, char *argv[])
28 {
29     int count;
30     int *nums;
31     int i = 0;
32     printf("argumentinum=%d\n",argc);
33     if(argc < 2){
34         printf("too few argument\n");
35         return ;
36     }
37     count = atoi(argv[1]);
38     nums = (int *)malloc(sizeof(int)*count);
39 //    printf("argumentinum=%d\n",count);
40     fibonacci(nums,count-1);
41     while(i < count){
42         if(i%4 == 0)
43             printf("\n");
44         printf("%d\t",nums[i]);
45         if(i == count-1)
46             printf("\n");
47         i++;
48     }
49     free(nums);
50 }
View Code

 

2. HanoiTower问题

 此问题,看上去复杂,必须先简化问题,才能实现。

这篇博客讲解很好,借鉴并加入自己的理解。

http://www.cnblogs.com/yanlingyin/archive/2011/11/14/2247594.html

有一个梵塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图)。

把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。最终必须要在A上面直接将盘子移动到C上面去,即使B上面有个最大的盘子,但是还得将盘子先放到A上面再移动到C上面才算数,这才符合规则。

描述简化:把A柱上的n个盘子移动到C柱,其中可以借用B柱。

 

 

递归就是要分解问题,减小问题的规模,使问题的形式和之前一样。

这个汉诺塔问题,通过三步分解:

  1. A上面的第n个盘子移动到C之前,n-1个盘子肯定在B上面,这要步。
  2. 1步骤之后,A上面仅剩一个盘子,移动到C即可,这要1步。
  3. 然后要将第n-1个盘子移动到C上面,先要将B上面的n-1个盘子移动到A上面,这需要的步数为
  4. 重复步骤1,只不过问题的规模变为了n-1个盘子。

 

 

于是,根据该公式可以快速的求得总步数,代码实现采用递归就很简单了。

posted on 2016-07-13 21:38  人生一世,草木一秋。  阅读(355)  评论(0编辑  收藏  举报