双递归背后的概念

时间:2018-03-04 19:14:27

标签: python python-3.x algorithm recursion lambda

有人可以解释一下这个双递归是如何工作的吗?我需要理解动作的顺序(即这个算法是如何工作的)我知道普通(单个)递归是如何工作的。例如,像这样:

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))

1 个答案:

答案 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