这是一个面试问题的答案,列举所有可能的助记符(给定电话号码,可能的字符序列)。类似于生成可能的排列问题之类的问题,所以问题也适用于此。
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‘列表工作,而不是实例化一个新的列表并在递归调用时传入。
发布于 2018-08-22 03:15:59
在进入递归函数之前,您正在创建一个新的partial_mnemonic变量来递归地保存部分助记符。一旦进入递归助手函数,代码就会在每个数字位置构建助记符,方法是在每个digit处更改partial_mnemonic的值,然后递归调用以保持构建可能性。一旦partial_mnemonic的递归跟踪达到电话号码的长度,基本情况将把它附加到您的排列列表中。代码将使用for循环遍历每种可能性,该循环再次调用相同的方法,只是使用partial_mnemonic列表,该列表现在包含部分构建的助记符。没有理由将新列表传递给helper函数,因为这会消除递归功能。
https://stackoverflow.com/questions/51954938
复制相似问题