Skip to main content
 首页 » 编程设计

python之我将如何迭代地编写这个递归函数

2025年05月04日10JeffreyZhao

在 Python 中:

def g(n):   
    if n <=3:         
        return n    
    return g(n-1) + 2 * g(n-2) + 3 * g(n-3) 

我明白这个函数在做什么,但我似乎不知道如何让它迭代。请帮助。如果可能,请提供解释,以便我能完全理解问题。

请您参考如下方法:

这看起来类似于斐波那契数列问题,并且以迭代方式实现起来并不简单。它看起来也像是家庭作业,所以我将发布获取斐波那契迭代的步骤,您应该能够将其应用于您的问题。

如果你不知道,斐波那契是这样定义的:

def fib(n): 
    if n <= 1:  # technically, this is not 100% correct, but it's fine for n>=0 
        return n 
    return fib(n-1) + fib(n-2) 

那么让我们分析一下fib(n) .首先我们看到有两种不同的情况:n <= 1和 not n <= 1 .对于 n <= 1 , fib(n)没有依赖关系,所以我们可以评估一下:

def fib_iter(n): 
    if n <= 1: 
        return n 

现在我们需要介绍另一种情况。我们先做一个依赖分析。我们需要什么 fib(n)与 n > 1 ?我们调用fib(n-1)和 fib(n-2) .在迭代语言中,这些将是前两个值。很明显,我们需要跟踪这些。我们将从那个的两个简单案例开始:

def fib_iter(n): 
    if n <= 1: 
        return n 
    prev1, prev2 = 0, 1 

我希望这是相当明显的。然后我们按照在递归方法中解析的顺序解析函数。当展开递归并分析函数时,我们发现第一个要计算的非平凡值当然是fib(2)。 .然后 fib(3)依此类推,直到我们到达 n .由于递归方法,多个值会被多次评估,但我们不需要在迭代方法中这样做。这些值相加,得到以下代码:

def fib_iter(n): 
    if n <= 1: 
        return n 
    prev1, prev2 = 0, 1 
    for i in xrange(2, n+1): 
        curr = prev1 + prev2        # calculate fib(i) 
        prev1, prev2 = prev2, curr  # shift previous value cache 

唯一缺少的是返回值,即 curr在循环结束时。正如我们所做的那样xrange(2, n+1)并检查 n <= 1事先,循环将至少运行一次,所以 curr将在循环外定义。

def fib_iter(n): 
    if n <= 1: 
        return n 
    prev1, prev2 = 0, 1 
    for i in xrange(2, n+1): 
        curr = prev1 + prev2 
        prev1, prev2 = prev2, curr 
    return curr 

(这是我的第一个家庭作业答案;SO 社区可能会给我反馈,如果我剧透太多,我本可以做得更好)