Visitors hit counter dreamweaver

再次认识的递归

  

  何为递归,通过递推关系把原来问题分缩小成一个相同的更小规模的问题,并延续着翼缩小的过程,直到在某一规模上,问题解释已知的,那么问题就解决了。

  上次举的例子是求阶乘的。阶乘可以表示为 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

 

posted @ 2013-05-04 11:15  Jason Damon  阅读(211)  评论(0编辑  收藏  举报