首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中使用按引用传递递归枚举

在Python中使用按引用传递递归枚举
EN

Stack Overflow用户
提问于 2018-08-22 02:47:44
回答 1查看 84关注 0票数 0

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

代码语言:javascript
复制
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‘列表工作,而不是实例化一个新的列表并在递归调用时传入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 03:15:59

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51954938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档