【问题标题】:C clarification on recursive functionsC 对递归函数的说明
【发布时间】:2014-04-06 21:48:02
【问题描述】:

您好,C 每天都在进步,这是我教科书中的一个示例问题,它生成斐波那契数并显示递归函数。该程序有效,但我只是不明白如何......特别是在部分(looper % 5),整个功能fibprintf(", %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));
}

【问题讨论】:

  • if (looper % 5) 只是帮助格式化输出,使用",""\n" 分隔值。
  • 哦,回头看看我现在看到的程序,它只是在四行上添加了“,”。即 1..4 % 5 = "," 和 5 % 5 = 10. % 有时会让人感到困惑......谢谢。

标签: c function recursion


【解决方案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,在这种情况下),然后返回,填写答案,直到你回到你开始使用的函数,并给出答案。

【讨论】:

  • 好的,我现在了解斐波那契数的数学。感谢您对此的澄清。那么在 fib() 函数中,当 looper 为 long fib(long num) 时,它的值是如何进入函数的。所以 C 中的函数足够聪明,只需设置 looper = num?没有指针和不同的类型 - 因为通常我会使用指针来处理这样的事情......如果是这样的话,那就太好了。我希望我的书能有更多关于这件事的内容......
  • fib 函数的原型采用long 类型的一个“参数”,称为num。在代码中,它被称为:fib(looper)。这意味着无论 looper 的当前值是什么,它都会作为第一个参数传递给fib 函数并保存到num 中。因此,当您与fib() 中的值交互时,您只需引用num 变量。这意味着调用fib 的代码中的参数名称无关紧要,该变量将被放入num 变量中,您可以使用它。好用!
  • 太棒了!我正在使用功能来测试它,是的,它确实有效。感谢您的帮助。
猜你喜欢
  • 2015-02-17
  • 1970-01-01
  • 2016-01-16
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
相关资源
最近更新 更多