当前位置: 首页 > 知识库问答 >
问题:

需要帮助理解此Python函数的递归流[重复]

杜海
2023-03-14

我很难理解以下函数的递归工作流程,以及它如何遍历排列排序数组。

让我感到困惑的一件特别的事情是“返回[nums[:]]”调用在递归函数中的行为。由于第9行再次调用自己,直到“start==2”,它什么时候继续执行第9行之后的行,以及它为哪个递归函数执行这些继续行?

抱歉,如果我的问题有点让人困惑,我最近才开始学习Python,希望更好地了解“return”调用在递归函数中的工作方式。任何建议都将不胜感激!

class Solution(object):
  def _permuteHelper(self, nums, start=0):
    if start == len(nums) - 1:
      return [nums[:]]

    result = []
    for i in range(start, len(nums)):
      nums[start], nums[i] = nums[i], nums[start]
      result += self._permuteHelper(nums, start + 1)
      nums[start], nums[i] = nums[i], nums[start]
    return result

  def permute(self, nums):
    return self._permuteHelper(nums)

print(Solution().permute([1, 2, 3]))
# [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]

共有1个答案

宋英杰
2023-03-14

使用打印语句是最好的分析方法之一(对于初学者来说)。您可以运行下面的代码来查看到底发生了什么(我只是在适当的地方插入了print语句)。

class Solution(object):
    def _permuteHelper(self, nums, start=0):
        if start == len(nums) - 1:
            print('Returns: ',[nums[:]])
            return [nums[:]]
        result = []
        print("Start: ",start)
        for i in range(start, len(nums)):
            nums[start], nums[i] = nums[i], nums[start]
            print("Swapped:", start," ", i)
            result += self._permuteHelper(nums, start + 1)
            nums[start], nums[i] = nums[i], nums[start]
        return result
    def permute(self, nums):
        return self._permuteHelper(nums)

print(Solution().permute([1, 2, 3])

输出:

Start:  0
Swapped: 0   0
Start:  1
Swapped: 1   1
Returns:  [[1, 2, 3]]
Swapped: 1   2
Returns:  [[1, 3, 2]]
Swapped: 0   1
Start:  1
Swapped: 1   1
Returns:  [[2, 1, 3]]
Swapped: 1   2
Returns:  [[2, 3, 1]]
Swapped: 0   2
Start:  1
Swapped: 1   1
Returns:  [[3, 2, 1]]
Swapped: 1   2
Returns:  [[3, 1, 2]]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]
 类似资料:
  • 编写一个方法writeChars,该方法接受整数参数n,并按如下方式输出n个字符。输出的中间字符应始终为星号(“*”)。如果要求您写出偶数个字符,则中间会有两个星号(“**”)。在星号之前,您应写出少于个字符(“ 我已经设法解决了这个问题,但不太明白一句话: 为什么是递归情况: n-2?而不是n-1?

  • 作为一个C新手,我真的很难理解C 11的新Move-Constructor,我希望有人可以解释我偶然发现的具体情况。让我们以此示例代码为例: 因此,我创建了一个 函数,该函数应将模型作为临时右值返回,并且我想将其分配给左值。我不希望编译器创建 对象的副本,因此我将复制构造函数定义为私有构造函数,并且我对赋值运算符执行相同的操作,以确保不复制任何数据。完成此操作后,代码不再正确编译,因此我添加了 M

  • 问题内容: 我有一个Person类,我想创建一棵树。这是Person类的解释器。 c1是左边的孩子,c2是右边的孩子。所以说我创建了三个这样的人: 因此,在这里您说亚当是根节点,亚当的左孩子是b,这是芭芭拉,他的右c是卡尔,依此类推。 所以我想做的是编写一个count方法,该方法计算包括在内的子代数。因此a.count()将返回6(如果Person f没有任何孩子)。 这是我的代码: 我在纸上运行

  • 需要帮助编写一个cassandra udf来添加/除/乘两个变量。尝试下面的代码,但它似乎不工作。而且我没有在Java的经验,所以可能是我不能调试。感谢你的帮助。

  • 我正在使用android Studio学习应用程序开发。 在build.gradle页面上,我遇到了一个错误,即 “编译'com.android.support:appcompat-v7:25.2.0'”