我想确认一下我是否理解如何在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),因为我认为它只能在你运行程序时进行评估。
答案 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
。