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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:36:03