【问题标题】:Stack limit exceeded due to repeated recursion由于重复递归而超出堆栈限制
【发布时间】:2019-03-06 23:55:03
【问题描述】:

此代码是使用递归打印斐波那契数列。所以我想设计一个递归而不是使用迭代,但是只要我执行代码并且一旦执行值提供程序函数,它就会显示一些错误“分段错误”。我只想这样做......有人可以帮忙吗?我只是一个初学者,所以请帮助和鼓励我......

#include<stdio.h>

int fibonacci(int n)
{
    int res;
    if(n==0)
        return 0;
    if(n==1)
        return 1;
    else
        res = fibonacci(n-1)+fibonacci(n-2);
    return res;

}
int value_provider(int n)
{
    int choice1;
    if(n>=0)
    {
        choice1 = fibonacci(n-1);
        n -- ;
    }
    printf("%d",choice1);
    if(n>=0)
    {
        value_provider(n);
    }

}

void main()
{
    int n;
    printf("enter the number");
    scanf("%d",&n);
    value_provider(n);
}

此代码显示分段错误... 我能做些什么来删除它而不是更改代码? 我只想这样做;请帮忙!

【问题讨论】:

  • 确保您没有尝试计算 -1 的斐波那契,对吧?
  • 为什么value_provider在没有return声明的情况下声明返回int
  • 我不认为value_provider 需要递归。您当前的fibonacci 实现已经是递归的,并且可以正确计算n 的斐波那契数。
  • 你的意见是什么?
  • 建议choice1 = fibonacci(n-1); --> choice1 = fibonacci(n); 供初学者使用

标签: c recursion call stack-overflow tail-recursion


【解决方案1】:

我认为您的 value_provider 函数的终止条件很差。

  • 不要尝试计算-1 的斐波那契,所以 n 必须是 &gt;=1

  • 同样,一旦n 为零,您需要完成递归,不要 再次致电value_provider

试试类似的东西;

int value_provider(int n)
{
  int choice1=-1;
  if(n>=1)
  {
     choice1 = fibonacci(n-1);
     n -- ;
  }
  printf("%d ",choice1);
  if(n>0)
  {
    value_provider(n);
  }
}

【讨论】:

  • 你还应该初始化choice1,这样if失败时你就不会得到UB。
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 2018-09-24
  • 2012-09-11
  • 2019-12-21
  • 1970-01-01
  • 2018-10-16
  • 2018-07-24
  • 2014-08-26
相关资源
最近更新 更多