提问人:Creator Magic 提问时间:1/18/2023 最后编辑:Vlad from MoscowCreator Magic 更新时间:1/18/2023 访问量:127
使用递归打印斐波那契数列
Printing Fibonacci series using Recursion
问:
//assume (main function)
int fibonacci(int a,int b){
//int i inifinite loop(why?)
static int i=1;
if(i==terms){
return 0;
}
else{
int c;
c=a+b;
a=b;
b=c;
printf(" %d ",c);
i++;
fibonacci(a,b);
return 0;
}
}
如果我在斐波那契函数(定义函数)中声明变量,它会打印垃圾值的无限循环,而不是我使用静态变量,然后代码打印斐波那契数列,请解释一下静态变量在此代码中是如何工作的?i
i
答:
1赞
Vlad from Moscow
1/18/2023
#1
如果将变量声明为具有自动存储持续时间i
int fibonacci(int a,int b){
//int i inifinite loop(why?)
int i=1;
//...
然后,在函数的每次递归调用中,变量都会被值重新初始化,并且您有一个无限循环的递归调用。i
1
将变量声明为具有静态存储持续时间时i
int fibonacci(int a,int b){
//int i inifinite loop(why?)
static int i=1;
//...
然后,在程序启动之前,它只初始化一次。
在任何情况下,您的函数都是不正确的,因为即使变量被声明为具有静态存储持续时间,它也不会在递归函数调用后重置为其初始值。此外,当函数依赖于全局变量时,这是一种糟糕的方法,因为您的函数依赖于全局变量。i
terms
此外,斐波那契数列是一个固定数列。用户不应指定变量和 。它应该为函数指定他将要获取的序列中数字的索引。该函数应返回此数字,而不是返回 0。a
b
例如,可以按以下方式定义函数
unsigned long long int fibonacci( unsigned int n )
{
return n < 2 ? n : fibonacci( n - 1 ) + fibonacci( n - 2 );
}
这是一个演示程序。
#include <stdio.h>
unsigned long long int fibonacci( unsigned int n )
{
return n < 2 ? n : fibonacci( n - 1 ) + fibonacci( n - 2 );
}
int main()
{
for (unsigned int i = 0; i < 10; i++)
{
printf( "%u -> %llu\n", i, fibonacci( i ) );
}
}
程序输出为
0 -> 0
1 -> 1
2 -> 1
3 -> 2
4 -> 3
5 -> 5
6 -> 8
7 -> 13
8 -> 21
9 -> 34
上一个:C++ 范围问题?[复制]
下一个:函数范围之外的动态分配
评论