编写函数fib(),通过函数的递归调用,输出斐波那契数据前n项的值。
我的方案:
#include <stdio.h>
int fib(int m);
main()
{
int i,n;
printf("请输入数列的项数:");
scanf("%d",&n);
for (i=1;i<=n;i++)
{
printf("%d,",fib(i));
}
}
int fib(int m)
{
if(m == 3)
return 2;
else if(m < 3)
return 1;
else if(m > 3)
return (fib(m-1)+fib(m-2));
}
new bing的方案:
int fib(int m)
{
if (m==1 || m==2)
return 1;
else
return fib(m-1)+fib(m-2);
}
new bing的方案2:
int fib(int n)
{
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n-1) + fib(n-2);
}
fib函数的过程是这样的:
- 首先,判断m是否为1或2,如果是,就直接返回1,因为这是斐波那契数列的前两项。
- 如果m不是1或2,就说明m大于等于3,那么就需要用递归的方法计算第m项的值。
- 递归的方法就是调用fib函数本身,但是参数不同。具体来说,就是调用fib(m-1)和fib(m-2),分别计算第m-1项和第m-2项的值,然后把它们相加,得到第m项的值。
- 这样,fib函数就可以不断地调用自己,直到遇到终止条件(m为1或2),然后返回结果。
举个例子,假设我们要计算fib(5),也就是斐波那契数列的第五项。那么fib函数的过程如下:
- fib(5)不满足终止条件(5不等于1或2),所以需要递归调用。
- fib(5) = fib(4) + fib(3),所以需要先计算fib(4)和fib(3)。
- fib(4)也不满足终止条件(4不等于1或2),所以需要递归调用。
- fib(4) = fib(3) + fib(2),所以需要先计算fib(3)和fib(2)。
- fib(3)也不满足终止条件(3不等于1或2),所以需要递归调用。
- fib(3) = fib(2) + fib(1),所以需要先计算fib(2)和fib(1)。
- fib(2)满足终止条件(2等于2),所以直接返回1。
- fib(1)满足终止条件(1等于1),所以直接返回1。
- fib(3) = fib(2) + fib(1) = 1 + 1 = 2,所以返回2。
- fib(2)满足终止条件(2等于2),所以直接返回1。
- fib(4) = fib(3) + fib(2) = 2 + 1 = 3,所以返回3。
- fib(3)已经计算过了,结果为2。
- fib(5) = fib(4) + fib(3) = 3 + 2 = 5,所以返回5。