你好每天在C上变得更好,这是我的教科书中的一个例子问题,它产生斐波纳契数并显示递归函数。该程序有效,但我只是不明白...具体在部分(looper % 5)
中,整个函数fib
和printf(", %8ld", fib(looper));
正在做什么。这就像说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));
}
答案 0 :(得分:1)
long 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,在这种情况下),并返回,填写答案,直到你回到你开始的功能,并给出答案。