Python递归查询

时间:2016-11-02 02:27:12

标签: python

我想确认一下我是否理解如何在python中以递归形式重写此函数。 功能是:

# Recurrence Relation
# F(n) = 7 * F(n-1) + 2 * F(n-2)
# F(1) = 1; F(2) = 1
# print (rr(4))

我的递归代码是:

def rr(n):
  return (2 * rr(n-1) + 2 * rr(n-2))

这是对的吗?另外,我怎么能“打印”rr(4),因为我认为它只能在你运行程序时进行评估。

3 个答案:

答案 0 :(得分:1)

您缺少基本案例。

# F(1) = 1; F(2) = 1

考虑:

def rr(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return 7 * rr(n-1) + 2 * rr(n-2)

此外,您的递归案例与递归关系不匹配。它有一个2,其中出现7

>>> def rr(n):
...     if n == 1:
...         return 1
...     elif n == 2:
...         return 1
...     else:
...         return 7 * rr(n-1) + 2 * rr(n-2)
... 
>>> print rr(4)
65

答案 1 :(得分:0)

您的代码将进行纯堆栈溢出,因为您还没有定义停止条件,即F(1)和F(2)的起始值。根据{{​​1}}的值来添加函数中的测试以处理这些情况。

答案 2 :(得分:0)

您没有添加基本案例,这将是递归的基础。

def rr(n):
    if n < 1:
        raise "Invalid input"
    if n <= 2:
        return 1
    return 7 * rr(n-1) + 2 * rr(n-2)

这将按如下方式运行:

rr(4) = 7 * rr(4-1) + 2 * rr(4-2)
      = 7 * rr(3) + 2 * rr(2)
      = 7 * (7 * rr(3-1) + 2 * rr(3-2)) + 2 * 1
      = 7 * (7 * r(2) + 2 * r(1)) + 2
      = 7 * (7 * 1 + 2 * 1) + 2
      = 7 * 9 + 2
      = 65

正如您所看到的,如果没有基本情况,您的函数将无限运行,因为rr(2)rr(1)永远不会解决;相反,他们继续调用相同的递归路径rr(1).. rr(0).. rr(-1)..etc