Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的置换:超过最大递归深度 我试图用函数C++生成的代码i来生成置换数。Python版本的错误在于 Line 42: RuntimeError: maximum recursion depth exceeded_Python_Recursion - Fatal编程技术网

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]
。谢谢,您是对的。更改该行后,程序运行正常!谢谢,你说得对。更改该行后,程序运行正常!