在Python中通过引用进行递归枚举

时间:2018-08-21 18:47:44

标签: python list recursion pass-by-reference pass-by-value

因此,这是对面试问题的解答,列举所有可能的助记符(给定电话号码的可能字符序列)。类似于生成可能的排列问题,这类问题也适用于此。

MAPPING = ('0', '1', 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ')


def phone_mnemonic(phone_number):
    def phone_mnemonic_helper(digit):
        if digit == len(phone_number):
            # All digits are processed, so add partial_mnemonic to mnemonics.
            # (We add a copy since subsequent calls modify partial_mnemonic.)
            mnemonics.append(''.join(partial_mnemonic))
        else:
            # Try all possible characters for this digit.
            for c in MAPPING[int(phone_number[digit])]:
                partial_mnemonic[digit] = c
                phone_mnemonic_helper(digit + 1)

    mnemonics, partial_mnemonic = [], [0] * len(phone_number)
    phone_mnemonic_helper(0)
    return mnemonics

关于按值/引用传递的方式,我更加困惑。由于“ partial_mnemonic”是在调用辅助函数并在其中进行修改之前在底部声明的,因此在递归堆栈中,它们不是在同一个“ partial_mnemonic”对象上运行吗?

由于我们没有传递名为“ partial_mnemonic”的列表,而只是在外部范围中使用了该列表,为什么我们在修改相同列表时不会遇到问题?

我想我对如何通过值/引用传递Python感到有些困惑,但是我不太确定为什么这段代码使用相同的“ partial_mnemonic”列表而不是实例化一个新的并将其传入递归调用时。

1 个答案:

答案 0 :(得分:1)

您正在创建一个新的partial_mnemonic变量,以在进入递归函数之前递归保留部分助记符。输入递归帮助器函数后,代码将通过更改每个partial_mnemonic的{​​{1}}的值并在递归调用以保持构建可能性的方式在每个数字位置构建助记符。一旦digit的递归跟踪达到电话号码的长度,基本情况将把它附加到您的排列列表中。该代码将使用partial_mnemonic循环遍历每种可能性,该循环再次调用同一方法,只是使用for列表,该列表现在包含部分构建的助记符。没有理由将新列表传递给helper函数,因为这将消除递归功能。