【问题标题】:Factorial recursion in C (Segmentation Fault)C中的阶乘递归(分段错误)
【发布时间】:2019-05-26 19:59:24
【问题描述】:

大家好,我是初学者,我的递归代码在计算数字的阶乘时遇到了问题。

我遇到分段错误,我不知道为什么会这样。

任何帮助将不胜感激:)

(例如,在我的代码中,我试图计算 4 的阶乘)

#include <stdio.h>

int factorial(int i) {
    int result = i * factorial(i - 1);
    return result;
}

int main()
{   
    int result = factorial(4);
    printf("result is %d", result);
}   

【问题讨论】:

  • 递归何时结束

标签: c recursion segmentation-fault factorial


【解决方案1】:

问题是,您缺少基本条件。因此,您的函数将永远运行,直到它使用您的程序可用的所有内存并最终放弃给出分段错误错误。

在编写递归函数时,您始终必须提供一个停止递归的基本条件。在你的情况下,它会是

if(i == 0)
    return 1;

这里你基本上是说当 i 变为 0 时停止递归。

【讨论】:

  • i==0时递归函数不是自己终止,返回主函数吗?
  • 对于返回主函数的方法,你必须告诉何时返回?试着想清楚。在您的情况下,您无限期地调用 factorial 方法。你从来没有说过什么时候停下来,这就是问题所在。基本条件告诉您的递归函数何时停止。另一个注意事项:您的递归函数不会直接返回到主函数,它将返回到调用堆栈顶部的函数。当所有递归函数都返回并从调用堆栈中删除时,只有它会进入主函数。
  • @JomHo 当i 为零时,int result=i*factorial(i-1) ; 行是int result=0*factorial(-1) ;,它调用factorial(-1),它调用factorial(-2),它调用factorial(-3) 等等。这会导致堆栈溢出,因为函数被无限调用。
  • @JomHo 不。为什么-1 会导致崩溃?崩溃是因为函数被无限调用时堆栈溢出。
  • 无效读取有点误导,当您的程序尝试访问不允许访问的内存区域时,您会遇到分段错误。由于您的递归方法耗尽了所有内存,因此没有内存可供您的程序使用。因此,一旦您进行下一次递归调用(因为您永远不会停止),您将收到此错误。这可能会帮助stackoverflow.com/questions/2346806/…
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2018-03-30
  • 2020-08-17
  • 2013-09-18
相关资源
最近更新 更多