Python 双重递归调用

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,并且不会继续 这是我的理

我在理解递归调用的部分时遇到了一些困难。据我所知,第二个递归调用不能在第一个到达阶段之前调用,这时它应该给出返回值。但是,第一个调用的作用(在示例中): 它给出了内部(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命中的

上面的语句是否跳入递归并不重要,因为与此语句的相关堆栈相比,这些变量和值位于较低的堆栈中

一个更简单的方法是分别考虑每个栈。

 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.