【问题标题】:Write a recursive function that inputs a positive integer n and outputs all permutations of {1, 2, . . . , n} [closed]编写一个递归函数,输入一个正整数 n 并输出 {1, 2, . . . , n} [关闭]
【发布时间】:2016-10-09 21:09:12
【问题描述】:

我无法解决此任务:

编写一个递归函数,输入一个正整数 n 和 输出所有 n! {1, 2, . . . , n}。不要使用任何 Sage 的排列命令。使用列表来存储值和工作 用那个列表。

示例输入:3

预期输出:(1,2,3), (1,3,2), (2,3,1),(2,1,3), (3,1,2), (3,2,1)

我在网上找到的所有东西都会生成列表的排列而不是整数。

我想计算我的阶乘将有助于确定我的输出长度。我不知道该怎么做。请帮帮我!谢谢 !

我试过了

def per(n):
   a = []
   for i in range(n):
       for j in range(n-i):
           a.append((i, j, n-i-j-1))
   return a
per(3) 

[(0, 0, 2), (0, 1, 1), (0, 2, 0), (1, 0, 1), (1, 1, 0), (2, 0, 0 )]

【问题讨论】:

  • 这个函数不是递归的...
  • 你能帮帮我吗!我已经尝试了很长时间,但我无法得到它!谢谢!
  • 您真正需要的是返回list(range(1, n + 1)) 的组合。这可以通过itertools.permutations(range(1, n + 1), n) 完成。因此,您可以查看the docs,了解该算法的可能实现方式。
  • 看看this 的帖子。问题似乎与您的问题相同,并且响应很好地解释了算法(尽管它是在 Java 中)。在您的情况下,nk 应该具有相同的值。
  • 不知道为什么这被如此严重地否决了,这对初学者来说并不是微不足道的,尤其是当像stackoverflow.com/questions/39948902/… 这样的问题在没有一行代码的情况下被赞成时。

标签: python sage


【解决方案1】:

您可以使用backtracking algorithm 来获取排列:

def backtrack(n=None, arr=None,  i=0, out=None):
    if out is None:
        out = []
        arr = list(range(1, n + 1))
    if i == n:
        out.append(tuple(arr))
    else:
        for j in range(i, len(arr)):
            arr[i], arr[j] = arr[j], arr[i]
            backtrack(n, arr, i + 1, out)
            arr[i], arr[j] = arr[j], arr[i]
    return out

只需传入元素个数:

In [18]: backtrack(3)
Out[18]: [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 2, 1), (3, 1, 2)]

或者使用生成器函数:

def backtrack(n=None, arr=None,  i=0):
    if arr is None:
        arr = list(range(1, n + 1))
    if i == n:
        yield (tuple(arr))
    else:
        for j in range(i, len(arr)):
            arr[i], arr[j] = arr[j], arr[i]
            yield from backtrack(n, arr, i + 1)
            arr[i], arr[j] = arr[j], arr[i]



print(list(backtrack(3)))

【讨论】:

    【解决方案2】:

    编辑:我创建了一个不使用模块并且递归工作的解决方案:

    def per(n, current_perm=[], results=[], remaining=None):
        if remaining is None:
            # Create a list of all items
            remaining = list(range(1, n+1))
        if len(remaining) == 1:
            # Only one item remaining - combine with
            # current path and add to results
            current_perm.append(remaining[0])
            results.append(current_perm)
            return
        for item in remaining:
            # Create a copy of the remaining list
            # and the current_permutation
            rem = list(remaining)
            cur = list(current_perm)
            # Remove the current item from the copy
            rem.remove(item)
            # Add the item to the current path
            cur.append(item)
            per(n, cur, results, rem)
        return results
    
    print(per(3))
    

    输出: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

    【讨论】:

    • 写一个递归函数.
    • 哎呀——我忽略了这个要求。删除这个答案合适吗?
    • 我明白了。因为我已经提到我不允许使用任何 Python 内置命令。我相信既然没有人投票,你可以删除它。谢谢!
    • 我刚刚更新了我的答案并创建了一个递归解决方案。不确定它是否与@PadraicCunningham 的解决方案类似,但它有效;-)
    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2013-11-08
    • 2019-09-15
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多