Python 双重递归调用
我在理解递归调用的部分时遇到了一些困难。据我所知,第二个递归调用不能在第一个到达阶段之前调用,这时它应该给出返回值。但是,第一个调用的作用(在示例中): 它给出了内部(9753,1)、内部(975,13)、内部(97135)、内部(91357)、内部(013579) 当n等于0时,s(13579)不能被k(5)整除,因此它不打印任何内容。此外,通过构造函数的方式,返回值是无的。因此,当达到内部(013579)阶段时,第二个递归调用必须开始工作,但是它将不断尝试0//10,并且不会继续 这是我的理解。你能指出我错在哪里吗 夫妻问题。 首先,将递归视为堆栈的层次结构 但是,第一个调用所做的(在示例中):它给出 内(9753,1)、内(975,13)、内(97135)、内(91357)、内(013579) 这里的一个问题是,第一个调用不会锁定到仅执行这一行。每个调用在else块中生成两个新调用。稍后会有更多信息 因此,当达到内部(013579)阶段时,将执行第二次递归调用 必须开始工作,但它将不断尝试0//10,并且不会 继续 这是有缺陷的。为什么此调用的“n”值必须为零?如果您还记得的话,这个调用的第一个实例是在else块中被n=97531命中的 上面的语句是否跳入递归并不重要,因为与此语句的相关堆栈相比,这些变量和值位于较低的堆栈中Python 双重递归调用,python,recursion,higher-order-functions,Python,Recursion,Higher Order Functions,我在理解递归调用的部分时遇到了一些困难。据我所知,第二个递归调用不能在第一个到达阶段之前调用,这时它应该给出返回值。但是,第一个调用的作用(在示例中): 它给出了内部(9753,1)、内部(975,13)、内部(97135)、内部(91357)、内部(013579) 当n等于0时,s(13579)不能被k(5)整除,因此它不打印任何内容。此外,通过构造函数的方式,返回值是无的。因此,当达到内部(013579)阶段时,第二个递归调用必须开始工作,但是它将不断尝试0//10,并且不会继续 这是我的理
一个更简单的方法是分别考虑每个栈。
def print_numbers(n, k):
"""Print all numbers that (A) can be formed from the digits of `n` in reverse
order and (B) are multiples of `k`.
Args: n (int): The number that results must use digits from.
k (int): The number that results must be multiples of.
>>> print_numbers(97531, 5)
135
15
35"""
def inner(n,s):
if n == 0:
if s % k == 0 and s > 0:
print(s)
else:
inner(n // 10, s*10 + n % 10) #first
inner(n // 10, s) #second
inner(n,0)
层次结构的每一层都有其确定的变量,并且将生成属于较低层次结构的递归函数,直到您分别针对每个“分支/生成”命中基本情况为止
总结
您可以将其归结为堆栈的层次结构。此时,此函数变得易于理解。基本上,当数字大于零时,对于每个数字,取出最后一个数字,并做出两个选择。使用最后一个数字,然后丢弃最后一个数字。反复这样做,你最终会考虑所有可能的数字,它们可以通过使用或丢弃数字以相反的顺序形成
stack 1: n = 97531
else: #n//10 = 9753
child1 (9753,1)
child2 (9753,0)
stack2 - child1:
else: #n//10 = 975
child11 (975,13)
child12 (975,1)
stack2 - child2:
else: #n//10 = 975
child21 (975, 3)
child22 (975, 0) #and so on.