首页 > 解决方案 > 尝试了一个来自 ac 教程网站的例子有点弄错了

问题描述

我正在从https://www.tutorialspoint.com/cprogramming/c_recursion.htm学习 C 中的递归, 并尝试了数字阶乘示例。

#include <stdio.h>

int fact(int i) {
    if (i <= 1) {
        return 1;
    }
    return fact(i - 1);
}

int main() {
    int i = 3;
    printf("numb = %d", fact(i));
    return 0;
}

执行代码后,它打印出 1。我查看了代码,发现我忘记在函数末尾乘以ivar fact(i - 1)。我修复了它并得到了正确的阶乘,但为什么fact(3 - 1)等于 1?

编辑

当我发布这个问题时,我对递归的理解非常肤浅,我以为fact(i-1)只会执行一次,并没有在教程中得到再次调用该函数的含义,当我阅读busybee的答案时我一开始并不理解我想我现在得到它,fact(3-1)称为fact(2-1)var 的值i现在是 1,它满足 if 条件并返回 1。正确版本中的另一个问题是,当我更改为 为什么返回时,我将 vari与它相乘,从模式来看将函数的结果与返回的数字相乘为什么?我承认我没有研究 return 的作用,只是顺其自然。fact(i-1)return 1return 212return 1return 26fact

标签: c

解决方案


要递归计算阶乘,i必须是正整数。因此,无论i是 0 还是 1,阶乘都是 1。

如果不是,则调用递归阶乘算法,(i - 1)然后将结果乘以i并返回该值,如下所示:

#include <stdio.h>

int fact(int i)
{
   if (i ==1)
      return 1;

   return fact(i - 1) * i; // You forgot to multiply  i  here
}

int main(void)
{
    int i = 3;
    printf("Number = %d", fact(i)); // Displaying the factorial of 3

    return 0;
}

推荐阅读