有人可以解释一下这个双递归是如何工作的吗?我需要理解动作的顺序(即这个算法是如何工作的)我知道普通(单个)递归是如何工作的。例如,像这样:
Q=lambda n:n>3 and Q(n-3)or n
print(Q(10))
所以,当n> 3时(在我们的例子中为真),我们转移到递归并减去3,然后得到7 - >它已超过3个,所以我们重复我们的行动(因为它仍然是真的)现在我们有4个,它仍然超过3个,所以我们再重复一遍,现在我们有1个.1小于3,现在它是假的。在False或n - >;我们得到n,所以这个单递归的结果将是1(n = 1)。 这对我来说绝对清楚。
但是我完全陷入了双重递归。我试图获得印刷品但到目前为止我不知道这里发生了什么。请帮忙。指向此功能的操作顺序。
F=lambda n:n>3 and F(n-3)+F(n-2)or n
print(F(10))
答案 0 :(得分:3)
您始终可以将递归堆栈视为树。如果你有双递归,那么考虑你有一个二叉树,即递归堆栈中每个节点将有两个分支。
如果您有单次递归,请将其视为skewed Tree
,如果您有triple recursion
,则将其视为3-ary Tree
,依此类推。对于n
递归,请考虑n-ary
树。
示例:
F=lambda n:n>3 and F(n-3)+F(n-2)
让,n = 10;
10
/ \
7 8
/ \ / \
4 5 5 6
/ \ /\ / \ /\
1 2 2 3 2 3 3 4 -----> returns here except last right node (i.e. 4)
/\
1 2 -----> returns here because its the base case (as n < 3)
因此,输出为1+2+2+3+2+3+3+1+2
,即19
此外,您始终可以打印出函数调用以更正确地理解递归。
示例,我在不使用lambda的情况下编写了相同的程序,我正在打印函数调用堆栈。
程序
F = lambda n:n>3 and F(n-3)+F(n-2) or n
def indent(n):
for i in xrange(n):
print ' '*i,
# the second argument is just passed to print the apt space before the print statement
def fun(n, rec_cnt):
indent(rec_cnt)
print 'fun(' + str(n) + ')'
if n <= 3:
return n
else:
return fun(n-3, rec_cnt+1) + fun(n-2, rec_cnt+1)
# print F(10)
print fun(10, 0)
您可以看到以下输出:
fun(10)
fun(7)
fun(4)
fun(1)
fun(2)
fun(5)
fun(2)
fun(3)
fun(8)
fun(5)
fun(2)
fun(3)
fun(6)
fun(3)
fun(4)
fun(1)
fun(2)
19