You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归求立方和出现Runtime Error Hangup(SIGHUP)问题求助

递归计算立方和时Python出现SIGHUP错误的原因及解决方法

问题背景

给定整数N,需递归计算数列1³+2³+3³+……+N³的和。Python实现的递归方案在小输入下正常运行,但输入较大数值(如18468)时出现Runtime Error Hangup(SIGHUP)错误,而相同逻辑的C++实现无此问题。

Python实现代码

#User function Template for python3

class Solution:
    def sumOfSeries(self,n):
        #code here
        if n>0:
            return (n*n*n) + self.sumOfSeries(n-1)
        else:
            return 0
            
#{ 
 # Driver Code Starts
#Initial Template for Python 3

if __name__=='__main__':
    t=int(input())
    for _ in range(t):
        N=int(input())
        ob=Solution()
        print(ob.sumOfSeries(N)) 
# } Driver Code Ends

C++实现代码

//{ Driver Code Starts
// Initial template for C++
#include <bits/stdc++.h>
using namespace std;

// } Driver Code Ends
// User function template for C++

class Solution {
  public:
    long long sumOfSeries(long long n) {
        // code here
        if (n==1) 
            return 1;
        else
            return (n*n*n)+sumOfSeries(n-1);
    }
};

//{ Driver Code Starts.
int main() {
    int t;
    cin >> t;
    while (t--) {
        long long N;
        cin >> N;
        Solution ob;
        cout << ob.sumOfSeries(N) << "\n";
    }
}
// } Driver Code Ends

错误原因分析

  • Python递归深度限制:Python默认递归深度上限约为1000(可通过sys.getrecursionlimit()查看)。当输入N=18468时,递归调用次数达到18468次,远超默认限制,触发栈溢出,最终导致进程被系统终止,表现为SIGHUP错误。
  • C++栈空间差异:C++的递归栈由操作系统管理,默认栈空间通常远大于Python(一般为几MB),且该递归场景下每个栈帧占用内存极小,不会触发栈溢出,因此可正常运行。

解决方法

方法1:临时提高递归深度限制

通过sys.setrecursionlimit()手动调高递归深度,但此方法不安全——设置过大可能导致进程直接崩溃,且不同环境栈空间上限不同,移植性差。示例:

import sys
sys.setrecursionlimit(20000) # 设置为大于18468的数值

class Solution:
    def sumOfSeries(self,n):
        if n>0:
            return (n*n*n) + self.sumOfSeries(n-1)
        else:
            return 0

方法2:改用迭代实现

完全避免递归,用循环累加计算,无深度限制且效率更高:

class Solution:
    def sumOfSeries(self,n):
        total = 0
        for i in range(1, n+1):
            total += i**3
        return total

方法3:使用数学公式

立方和有现成公式:$13+23+...+n^3 = \left(\frac{n(n+1)}{2}\right)^2$,直接计算公式,时间复杂度O(1),彻底规避递归和循环:

class Solution:
    def sumOfSeries(self,n):
        return (n*(n+1)//2)**2

内容的提问来源于stack exchange,提问作者Kartikey Joshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:16:00