我如何迭代地编写这个递归函数?

时间:2012-06-29 16:41:14

标签: python function recursion iteration

在Python中:

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

我理解这个函数正在做什么,但我似乎无法让它如何迭代。请帮忙。如果可能,请附上说明,以便我完全理解问题。

4 个答案:

答案 0 :(得分:8)

这看起来类似于斐波纳契系列问题,并且以迭代方式实现并非易事。它看起来也像是家庭作业,所以我将发布迭代斐波那契的步骤,你应该能够将它应用到你的问题中。

如果您不知道,斐波那契的定义如下:

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 <= 1not n <= 1。对于n <= 1fib(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

我希望这很明显。然后我们按递归方法解析它们的顺序解析函数。在展开递归并分析函数时,我们发现将要评估的第一个非trival值当然是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社区可能会给我反馈,如果我过分浪费我可以做得更好)

答案 1 :(得分:4)

def g(n):
    if n <= 3:
        return n
    a, b, c = 1, 2, 3
    for i in range(3, n):
        a, b, c = b, c, (a * 3 + b * 2 + c)
    return c

答案 2 :(得分:3)

您的递归函数可以读作

To find the value of g(30), find the value of g(29), g(28), and g(27)
  To find the value of g(29), find the value of g(28), g(27), and g(26)
    To find the value of g(28), find the value of g(27), g(26), and g(25)
      ...
        (repeat until all sub-finds have completed)

迭代函数将从另一端开始,

I know the values of g(1), g(2), and g(3) -> calculate g(4)
I know the values of g(2), g(3), and g(4) -> calculate g(5)
I know the values of g(3), g(4), and g(5) -> calculate g(6)
...
(repeat until the desired g(n) is reached)

答案 3 :(得分:1)

这无法解决......

def g(n, *, _cache=[0, 1, 2, 3]):
    for _ in range(n - len(_cache) + 1):
        _cache.append(sum(i * _cache[-i] for i in (1, 2, 3)))
    return _cache[n]

希望你已经找到了解决方案。