R语言使用递归函数计算正整数和时报C栈占用接近上限错误如何解决
问题根因
- 你的推导公式本身是正确的,但代码逻辑存在核心错误:你定义的
penta_recur函数本身是用于计算$\sum_{k=n}{2n-1}k$的区间和,并非计算前m项正整数和$\sum_{k=1}{m}k$的函数,但你在else分支直接用penta_recur计算两个前项和,导致递归参数不断变大,永远无法触发n==1的终止条件,最终触发无限递归、栈溢出报错。 - 举个简单的例子:当你调用
penta_recur(2)时,会生成参数x=3,随后调用penta_recur(2)会调用penta_recur(3),调用penta_recur(3)时会生成x=5,又调用penta_recur(4),参数越来越大,永远不会走到终止分支。
解决方案
方案1:基于正确的递归关系重写函数
先推导该求和公式的递推关系:
计算前几个值可得到规律:
- n=1时,和为1
- n=2时,和为2+3=5 = 1 + 3*2 -2
- n=3时,和为3+4+5=12 =5 +3*3 -2
- 递推式为:$penta(n) = penta(n-1) + 3n -2$
对应代码如下:
penta_recur=function(n){ if (n == 1){ return(1) } else { return(penta_recur(n-1) + 3*n -2) } }
测试验证:penta_recur(3)返回12,符合预期。
方案2:保留拆分思路,单独实现前m项和的递归函数
如果你一定要坚持用$\sum_{k=n}^{2n-1}k = \sum_{k=1}^{2n-1}k - \sum_{k=1}^{n-1}k$的拆分逻辑,需要单独写一个计算前m项正整数和的递归函数,不能混用当前的区间求和函数:
# 单独定义递归计算1到m的和的函数,m为0时返回0 sum_1_to_m = function(m){ if(m <= 0){ return(0) } else { return(m + sum_1_to_m(m-1)) } } penta_recur=function(n){ x = 2*n -1 y = n -1 return(sum_1_to_m(x) - sum_1_to_m(y)) }
测试验证:penta_recur(4)返回4+5+6+7=22,符合预期。
内容的提问来源于stack exchange,提问作者youfacejaraxxus
相关产品推荐
相关产品推荐

