python中的置换:超过最大递归深度 我试图用函数C++生成的代码i来生成置换数。Python版本的错误在于 Line 42: RuntimeError: maximum recursion depth exceeded
对于输入python中的置换:超过最大递归深度 我试图用函数C++生成的代码i来生成置换数。Python版本的错误在于 Line 42: RuntimeError: maximum recursion depth exceeded,python,recursion,Python,Recursion,对于输入[5,4,6,2] class Solution: # @param {integer[]} nums # @return {integer[][]} def permute(self, nums): result = [] if len(nums) == 0: return result if len(nums) == 1: result.append(nums)
[5,4,6,2]
class Solution:
# @param {integer[]} nums
# @return {integer[][]}
def permute(self, nums):
result = []
if len(nums) == 0:
return result
if len(nums) == 1:
result.append(nums)
return result
if len(nums) == 2:
result.append(nums)
a = nums[0]
b = nums[1]
newrow = [b,a]
result.append(newrow)
return result
for i in range(0, len(nums)):
temp = nums
fixvalue = temp[i]
del(temp[i])
tempresult = self.permute(temp)
for j in range(0, len(tempresult)):
tempresult[j].insert(0,fixvalue)
result.append(tempresult[j])
return result
递归实际上是通过行将元素添加到列表中
tempresult[j].insert(0,fixvalue)
你需要换线
temp = nums
到
这将创建输入的副本。您当前的代码正在处理原始代码
我不知道为什么会有一个Java风格的类
解决方案
包含permute
而没有任何状态。为什么不简单地使用permute
作为函数?类添加了什么?您的递归实际上是通过行将元素添加到列表中
tempresult[j].insert(0,fixvalue)
你需要换线
temp = nums
到
这将创建输入的副本。您当前的代码正在处理原始代码
我不知道为什么会有一个Java风格的类
解决方案
包含permute
而没有任何状态。为什么不简单地使用permute
作为函数?类添加了什么?代码的逻辑在处理列表时有几个错误。事实上,我对您遇到的错误感到有点惊讶,因为我本以为更可能出现索引器
,但事实证明,您在删除列表的同时也在向列表中添加新值
以下是错误的核心:
temp = nums
<>这不符合你的期望,如果你来自C或C++。它不会复制存储在nums
变量中的列表,并将复制的数据存储为temp
。它只是创建对同一列表对象的引用。当您稍后修改temp
(使用del
,在一些令人困惑的情况下,使用insert
)时,您也在修改nums
您应该将Python中的赋值看作是C中的指针赋值。两个指针可以引用内存中的同一点,通过其中一个指针修改内存将影响通过另一个指针读取内存时看到的内容
至于如何解决这个问题,如果您以某种方式复制
nums
列表的内容,您的运气可能会更好。在使用del
修改副本之前,您可以使用list
或切片nums[:]
复制整个内容,或者可以使用两个较小的切片直接获取所需的值(nums[:i]+nums[i+1:://code>)。代码的逻辑在处理列表时有几个错误。事实上,我对您遇到的错误感到有点惊讶,因为我本以为更可能出现索引器
,但事实证明,您在删除列表的同时也在向列表中添加新值
以下是错误的核心:
temp = nums
<>这不符合你的期望,如果你来自C或C++。它不会复制存储在nums
变量中的列表,并将复制的数据存储为temp
。它只是创建对同一列表对象的引用。当您稍后修改temp
(使用del
,在一些令人困惑的情况下,使用insert
)时,您也在修改nums
您应该将Python中的赋值看作是C中的指针赋值。两个指针可以引用内存中的同一点,通过其中一个指针修改内存将影响通过另一个指针读取内存时看到的内容
至于如何解决这个问题,如果您以某种方式复制nums
列表的内容,您的运气可能会更好。在使用del
修改副本之前,您可以使用list
或切片nums[:]
复制整个内容,也可以使用两个较小的切片直接获取所需的值(nums[:i]+nums[i+1://code>),python在itertools.permutations
中提供了现成的解决方案
如果您想将此作为练习,则代码存在以下几个问题:
- 在递归之前,必须复制列表
- 您的递归算法需要为空列表或包含一项的列表指定一个特殊情况,否则它将不会退出,因此超出了递归限制
如果您更正了算法,但仍然超出递归限制,则可以使用以下命令更改递归限制(默认值1000):
我的建议是看看itertools中的解决方案。如果您只需要排列,python在itertools.permutations中提供了一个现成的解决方案
如果您想将此作为练习,则代码存在以下几个问题:
- 在递归之前,必须复制列表
- 您的递归算法需要为空列表或包含一项的列表指定一个特殊情况,否则它将不会退出,因此超出了递归限制
如果您更正了算法,但仍然超出递归限制,则可以使用以下命令更改递归限制(默认值1000):
我的建议是看看itertools中的解决方案。您的解决方案不适用于输入[1,2,3]
。您的解决方案不适用于输入[1,2,3]
。谢谢,您是对的。更改该行后,程序运行正常!谢谢,你说得对。更改该行后,程序运行正常!