使用递归打印斐波那契数列

Printing Fibonacci series using Recursion

提问人:Creator Magic 提问时间:1/18/2023 最后编辑:Vlad from MoscowCreator Magic 更新时间:1/18/2023 访问量:127

问:

//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;
    }
}

如果我在斐波那契函数(定义函数)中声明变量,它会打印垃圾值的无限循环,而不是我使用静态变量,然后代码打印斐波那契数列,请解释一下静态变量在此代码中是如何工作的?ii

c 递归 斐波那契 函数定义 storage-duration

评论

1赞 drw85 1/18/2023
常规 int 变量的范围限定为当前斐波那契函数。如果递增它,然后通过递归调用另一个斐波那契函数,则该新函数具有自己的作用域,因此是一个新的 int 变量。本地声明的变量仅在其上下文中可用,在本例中为斐波那契函数。
0赞 Dominique 1/18/2023
什么是“条款”?
0赞 WedaPashi 1/18/2023
@Dominique:OP打算打印的序列长度似乎是。
0赞 Dominique 1/18/2023
@WedaPashi:你说的是全局变量吗?这通常是一个非常糟糕的主意。
0赞 Steve Summit 1/18/2023
顺便说一句,使用递归来计算斐波那契数列通常是一个糟糕且不必要的想法。递归非常适合一些问题,但斐波那契数列不是其中之一。

答:

1赞 Vlad from Moscow 1/18/2023 #1

如果将变量声明为具有自动存储持续时间i

int fibonacci(int a,int b){

    //int i inifinite loop(why?)
    int i=1;
    //...

然后,在函数的每次递归调用中,变量都会被值重新初始化,并且您有一个无限循环的递归调用。i1

将变量声明为具有静态存储持续时间时i

int fibonacci(int a,int b){

    //int i inifinite loop(why?)
    static int i=1;
    //...

然后,在程序启动之前,它只初始化一次。

在任何情况下,您的函数都是不正确的,因为即使变量被声明为具有静态存储持续时间,它也不会在递归函数调用后重置为其初始值。此外,当函数依赖于全局变量时,这是一种糟糕的方法,因为您的函数依赖于全局变量。iterms

此外,斐波那契数列是一个固定数列。用户不应指定变量和 。它应该为函数指定他将要获取的序列中数字的索引。该函数应返回此数字,而不是返回 0。ab

例如,可以按以下方式定义函数

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