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

编写一个递归函数,输入一个正整数n并输出{1,2,…,n}[闭合]的所有置换

雷锋
2023-03-14

编辑问题以包括所需的行为、特定问题或错误,以及再现问题所需的最短代码。这将帮助其他人回答这个问题。

我无法解决此任务:

编写一个递归函数,输入一个正整数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)]

共有2个答案

朱运诚
2023-03-14

编辑:我创建了一个解决方案,它不使用任何模块,可以递归工作:

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]]

邹开畅
2023-03-14

您可以使用回溯算法来获得排列:

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)))
 类似资料:
  • 本文向大家介绍请写出一个函数求出N的阶乘(即N!)相关面试题,主要包含被问及请写出一个函数求出N的阶乘(即N!)时的应答技巧和注意事项,需要的朋友参考一下

  • 本文向大家介绍写出一个函数,输入是两个数组,输出是将两个数组中所有元素排序以后用一个数组输出。相关面试题,主要包含被问及写出一个函数,输入是两个数组,输出是将两个数组中所有元素排序以后用一个数组输出。时的应答技巧和注意事项,需要的朋友参考一下 参考回答: //快速排序 //两路归并 cerr << "内存分配失败" << endl;  

  • 家庭作业:寻找更好的策略或方法,而不是完整的代码。 当我试图确定这个问题的递归情况时,我完全被弄糊涂了。我必须编写一个接受整数参数“n”的方法,然后输出总共“n”个字符。根据原始整数是奇数还是偶数,中间字符应始终为“”或“*”。下面是两个不同的方法调用和输出应该是什么样子: 我该如何识别递归案例呢?

  • 使用以下代码: 为什么这个输出: 而不是我所期望的,那就是: 我讨厌递归。我讨厌递归。我讨厌递归。谢谢

  • 我想找出一种方法,从整数中找出整数的最大和。 在这种情况下,输入总是整数的数组,任务是使用数字(每个数字只能使用一次)计算最大可能的和。 以下是我到目前为止提出的方法,但我不知道如何用一种方法来完成这一切。 有了这个输入:程序应该打印出。