c# 使用递归打印Fibonacci数列

8dtrkrch  于 2023-01-19  发布在  C#
关注(0)|答案(1)|浏览(215)
//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变量,那么代码会打印斐波那契系列,请解释一下静态变量在此代码中是如何工作的?

raogr8fs

raogr8fs1#

如果声明变量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
此外,斐波那契数列是一个固定数列,用户不应该指定变量ab,而应该为函数指定他要得到的数列中的数字的索引,并且函数应该返回这个数字而不是返回0。
例如,函数可以按以下方式定义

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

相关问题