C关于递归函数的澄清

C关于递归函数的澄清,c,function,recursion,C,Function,Recursion,大家好,C语言每天都在进步,这是我课本中的一个例子,它生成斐波那契数并显示递归函数。这个程序很有效,但我不明白怎么。。。特别是在部分(活套%5),整个函数fib和什么printf(“,%8ld”,fib(活套))正在执行。这就像说fib()做x次一样。如果这个问题不容易解释,那么除了“河内之塔”的例子之外,有人能给我一个更容易理解递归函数如何工作的方法吗。谢谢 注意:这个程序可以处理多达30个数字,如果其他人认为它看起来很难看的话 #define _CRT_SECURE_NO_WARNINGS

大家好,C语言每天都在进步,这是我课本中的一个例子,它生成斐波那契数并显示递归函数。这个程序很有效,但我不明白怎么。。。特别是在部分
(活套%5)
,整个函数
fib
和什么
printf(“,%8ld”,fib(活套))正在执行。这就像说fib()做x次一样。如果这个问题不容易解释,那么除了“河内之塔”的例子之外,有人能给我一个更容易理解递归函数如何工作的方法吗。谢谢
注意:这个程序可以处理多达30个数字,如果其他人认为它看起来很难看的话

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

long fib (long num);

int main(void)
{
    int seriesSize;

    printf("This program will print out a Fibonacci series.\n");
    printf("How many many numers do you wnat? ");

    scanf_s("%d", &seriesSize);

    printf("First %d Fib numbers: \n", seriesSize);
    for (int looper = 0; looper < seriesSize; looper++)
    {
        if (looper % 5)
        {
            printf(", %8ld", fib(looper));
        }
        else
        {
            printf("\n%8ld", fib(looper));
        }
    }
    printf("\n");
    return 0;
}

long fib(long num)
{
    if (num == 0 || num == 1)
    {
        return num;
    }
    return (fib(num - 1) + fib(num - 2));
}
\define\u CRT\u SECURE\u NO\u警告
#包括
长fib(长num);
内部主(空)
{
int系列化;
printf(“此程序将打印出斐波那契数列。\n”);
printf(“你有多少个数字?”);
scanf_s(“%d”&系列化);
printf(“前%d个光纤编号:\n”,序列化);
for(int-looper=0;looper
长fib(long num)
函数背后的思想是它反映了斐波那契序列的自然定义,因为它是根据自身定义的。也就是说,fib(n)由fib(n-1)和fib(n-2)定义。例如,fib(5)是fib(4)+fib(3)

教科书以如上所述的递归方式编写了函数。请注意,这不是实现斐波那契函数的最有效方法,但在逻辑上是有意义的

为了理解它,通过一个示例输入跟踪它的执行是值得的。以fib(3)为例。第一个
if
语句没有触发,因为
num
不是0或1。因此,它计算出什么是fib(2)和fib(1),并将它们相加。我们知道fib(1)的作用-它在第一个if语句中返回1。以类似的方式跟踪fib(2),您将看到它返回1。因此,fib(3)将返回fib(2)+fib(1)=2。你可以进一步扩展它——以fib(4)为例。它将返回fib(3)+fib(2),我们知道是2和1,因此fib(4)=3


这种方法适用于大多数递归函数——可以将其视为创建fib()函数的新实例,该函数不断创建,直到在结束情况下“见底”(在本例中,num==1或num==0),然后返回backup,填写答案,直到返回到开始使用的函数为止,并给出答案。

if(looper%5)
只是帮助格式化输出,使用
“,”
“\n”
分隔值。哦,回顾一下我现在看到的程序,它只是在四行上添加了“,”。即1..4%5=“,”5%5=10.%有时会让人困惑……谢谢。好了,我现在理解了斐波那契数的数学。谢谢你在这方面的解释。那么在fib()函数中,looper的值是长fib(long num)时如何进入函数的呢.所以C中的函数足够聪明,只需设置looper=num?,而不需要指针和不同的类型-因为通常我会使用指针来处理类似的事情…如果是这样的话,那就太好了。我希望我的书中能有更多关于这个问题的内容。
fib
函数的原型需要一个“参数”,类型为
long
,称为
num
。在代码中,它被称为:
fib(looper)
。这意味着无论looper的当前值是什么,它都会作为第一个参数传递到
fib
函数中,并保存到
num
中。因此,当您与
fib()中的值交互时
,您只需引用
num
变量。这意味着无论调用
fib
的代码中参数的名称是什么,变量都将被放入
num
变量中,您可以使用它。方便!太棒了!我正在玩函数来测试它,是的,它确实有效。谢谢您或者你的帮助。