递归求立方和出现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
相关产品推荐
相关产品推荐

