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