【问题标题】:recursive function in cpp gives error "Segmentation fault (core dumped)"cpp 中的递归函数给出错误“分段错误(核心转储)”
【发布时间】:2021-01-02 16:46:55
【问题描述】:

我想要做的是返回所有低于或等于 n 之类的数字的总和,它们是 3 或 5 的倍数,我尝试在 c++ 中使用递归函数来执行此操作:

#include <iostream>

int getsum(int n);

int main(int argc, char *argv[]){

    std::cout<<getsum(10);
    
    return 0;
}

int getsum(int n){

    if(n%3==0 || n%5==0)
        return n+getsum(n-1);
    if(n==0) 
        return 0;
    else
    {
        return getsum(n-1);
    }
    
}

然后当我尝试运行此代码时,我得到分段错误错误:


Segmentation fault (core dumped)

我的递归函数有问题吗?

*操作系统:Ubuntu 18.04

【问题讨论】:

  • 这应该返回 33 for n=10
  • 0 % 30
  • 什么是 0 % 3?什么是 0% 5?将您的基本案例移到顶部。无论如何都不是递归的好用例。
  • if(n == 0)成为第一件事。
  • 用你的开发环境中应该附带的调试器来单步调试这个函数几次,你会非常非常快地看到发生了什么。不要浪费时间。学习使用调试器。

标签: c++ recursion segmentation-fault


【解决方案1】:

问题是当n 达到零时,你就进入了区块。

if(n%3==0 || n%5==0)
    return n+getsum(n-1);

一旦n 达到负数,递归调用就会一直持续下去。这会导致堆栈溢出。

您应该首先将支票移到零。

int getsum(int n)
{
   std::cout << "n: " << n << std::endl;

   if(n==0) 
   {
      return 0;
   }
   if(n%3==0 || n%5==0)
   {
      return n+getsum(n-1);
   }
   else
   {
      return getsum(n-1);
   }
}

额外的std::cout &lt;&lt; 行将帮助您作为诊断工具跟踪呼叫流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2012-11-19
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多