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 }
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柱。
递归就是要分解问题,减小问题的规模,使问题的形式和之前一样。
这个汉诺塔问题,通过三步分解:
- A上面的第n个盘子移动到C之前,n-1个盘子肯定在B上面,这要步。
- 1步骤之后,A上面仅剩一个盘子,移动到C即可,这要1步。
- 然后要将第n-1个盘子移动到C上面,先要将B上面的n-1个盘子移动到A上面,这需要的步数为
- 重复步骤1,只不过问题的规模变为了n-1个盘子。
于是,根据该公式可以快速的求得总步数,代码实现采用递归就很简单了。