递归函数G(n)运行时间递推关系式求解及错误排查
分析递归函数G(n)的时间递推式错误原因及正确解法
嘿,我来帮你理清这个问题——你之前的递推式出错的核心原因,是没注意到循环的执行次数对递归调用的影响!我们先一步步拆解函数的执行流程,再推导正确的递推式。
首先把原函数的代码清晰展示出来:
function G(n): if n>0 then: x=0 for i = 1 to n: x = x + 1 G(n-1) end if
你的错误点分析
你之前写出的递推式 T(n) = T(n-1) + 1,相当于默认循环只执行了一次、只调用了一次G(n-1),但实际上这个for循环是从i=1到i=n,会完整执行n次,每一次循环里都会触发一次G(n-1)的调用。这才是问题的关键!
正确的递推式推导
我们定义T(n)为函数G(n)的运行时间,分情况讨论:
- 当
n ≤ 0时,函数直接跳过循环和递归逻辑,运行时间是常数级的,所以:T(n) = Θ(1)(或者简化写成T(n) = c,其中c是一个固定常数) - 当
n > 0时,函数的执行分为几部分:- 初始化
x=0:这是常数时间操作,记为Θ(1) - 执行
n次循环,每次循环包含两个操作:x = x + 1:常数时间Θ(1)- 调用
G(n-1):运行时间为T(n-1)
把这些加起来,总运行时间就是:T(n) = Θ(1) + n*(Θ(1) + T(n-1))
我们可以把常数项合并简化,最终递推式可以写成:T(n) = n*T(n-1) + Θ(n)
- 初始化
如果我们把所有常数操作都近似为1(方便计算具体数值),递推式也可以写成:T(n) = n*T(n-1) + n(初始化的1 + n次循环里每次的1,总共n+1,合并为n不影响渐近趋势)
小例子验证
比如拿n=1来验证:
G(1)执行流程:初始化x(1步)→ 循环1次:x+1(1步)+ G(0)(1步),总步数是3- 用递推式计算:
T(1)=1*T(0)+1=1*1+1=2?这里的差异是因为常数项的计数粒度,但核心的n*T(n-1)是正确的,渐近复杂度的推导不受这个小差异影响。
再看n=2:
- 实际执行总步数:初始化x(1)→ 循环i=1:x+1(1)+G(1)(3)→ 循环i=2:x+1(1)+G(1)(3),总步数9
- 递推式计算:
T(2)=2*T(1)+2=2*3+2=8,同样是常数项的计数问题,但整体的增长趋势完全匹配。
内容的提问来源于stack exchange,提问作者Goot56
相关产品推荐
相关产品推荐

