再次认识的递归
何为递归,通过递推关系把原来问题分缩小成一个相同的更小规模的问题,并延续着翼缩小的过程,直到在某一规模上,问题解释已知的,那么问题就解决了。
上次举的例子是求阶乘的。阶乘可以表示为 n! = n*(n-1)!;当n=0时是已知的。那么很明显,这就是可以把一个问题缩小到一个更小的规模。
再来举个例子。Fibonacci数列。数列的第一个和第二个数都为1,接下来每个数都等于前面两个数的和。那么我们就可以得到公式 f(n) = f(n-1) + f(n-2);好了,问题瞬间解决了,这不也是递归的思想吗,把原来问题缩小,并且某个状态时刻的解是已知的。OK,问题解决。下面是是最简单的例子:
问题描述
菲波那契数列是指这样的数列:数列的第一个和第二个数都为1,接下来每个数都
等于前面2 个数之和。给出一个正整数a,要求菲波那契数列中第a 个数是多少。
输入数据
第 1 行是测试数据的组数n,后面跟着n 行输入。每组测试数据占1 行,包括一个
正整数a(1 <= a <= 20)。
输出要求
n 行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a 个数
的大小。
输入样例
4
5
2
19
1
输出样例
5
1
4181
1
//f(n) = f(n-1) + f(n-2) #include <stdio.h> int fibonacci(int n) { if (n == 2 || n == 1) { return 1; } else { return (fibonacci(n-1)+fibonacci(n-2)); } } int main() { int nCount,n; scanf("%d",&nCount); while (nCount) { nCount--; scanf("%d",&n); printf("%d\n",fibonacci(n)); } }
2013/5/4 11:14
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法