【问题标题】:c++ segmentation fault, why using "long long" I dont get an answer?c++ 分段错误,为什么使用“long long”我没有得到答案?
【发布时间】:2019-12-17 23:05:04
【问题描述】:

有人能解释一下这段代码的错误在哪里吗?因为当我使用这样的参数时 a=425 b=9631 n=9876543215 我得到“退出,分段错误代码 139” :(

#include <iostream>
#include <iomanip>
using namespace std;
void ivedimas(long long &n, long long &a, long long &b);
long long fib(long long n, long long a, long long b); 
void isvedimas(long long ats);
int main()
{
    long long n,a,b;
    ivedimas(n,a,b);
    isvedimas(fib(n,a,b));
    return 0;
}

void ivedimas(long long &n, long long &a, long long &b)
{
    cin>>a>>b>>n;
}
long long fib(long long n,long long a, long long b)
{
  long long c=b-a;
  if (n==2)
  return c;
  return fib(n-1,b,c);
}
void isvedimas(long long ats)
{
    cout<<ats<<endl;
}

【问题讨论】:

  • 堆栈溢出似乎很可能。你的递归没有终止吗?
  • 即使它确实最终停止递归,它也会调用自己9876543213 次!这会消耗大量的堆栈。
  • @AdrianMole:好点子!
  • 我也同意,堆栈溢出可能是罪魁祸首。堆栈的大小通常为 1-8MB,因此创建 9876543213 堆栈帧很可能会耗尽它,并且您会遇到分段错误。考虑切换到迭代算法。
  • 使用9876543215 函数调用可能会耗尽堆栈空间并崩溃。每个递归调用都需要设置一个单独的函数堆栈。 (这就是为什么必须小心处理递归,以确保它不会重复太多次而导致空间不足)

标签: c++ fibonacci


【解决方案1】:

堆栈溢出:每次函数调用自己时,它都会添加到堆栈中,因此此解决方案适用于小数字,但任何太大都会失败。

迭代解决方案:

long long fib(long long n, long long a, long long b)
{
    if (n == 0) {return 0;}
    if (n == 1) {return 1;}
    long long t = 0;
    long long j = 1;
    for (int i = 2; i <= n; i++) {
        int k = j;
        j += t;
        t = k;
    }
    return j;
}

【讨论】:

  • c++(或它最流行的编译器,确切地说)不支持尾调用优化吗?
  • 你问为什么函数有参数@sp2danny?我用重复的 i 修复了错误。我刚刚从 OP 复制了函数签名
  • @Tasos TCO 通常在调试版本中被禁用。
  • TCO 中断回溯。没有理由单递归算法(因为它们总是很容易手动转换),除非你是一个不处理现实世界计算机的纯粹主义者。
  • 开玩笑吗?如果给出功能码,请确保它工作正常。
【解决方案2】:

斐波那契的这种递归版本不适用于大数。每次调用递归时,堆栈都会增加并且永远不会减少到最后。因此,您只需在返回结果之前终止进程内存即可。

您可以尝试迭代解决方案。

【讨论】:

    【解决方案3】:

    谢谢,这是解决方案:)) 序列中的每 6 个数字都是相同的 :) 例如10,8,-2,-10,-8,2|10,8,-2,-10,-8,2...

    long long fib(long long n,long long a, long long b)
    { long long c=a;
    if (n==0) return a;
    if (n%6==1) return b;
      for (int i=1;i<n%6;i++)
      {
        c=b-a;
        a=b;
        b=c;
      }
      return c;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2020-01-20
      • 2018-06-06
      • 2020-06-05
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多