按字典顺序列出数字1,...,n的所有排列

时间:2009-03-15 00:48:43

标签: matlab swap lexicographic

我正在尝试编写一个Matlab来列出字典顺序中数字1到n的所有排列。我到目前为止的内容如下。我正在使用递归来尝试编写一个首先适用于n = 3的程序,然后看看我是否可以深入了解为任何n编写程序。到目前为止,我有6列中的2列n = 3:P=[1 2 3;1 3 2]。我需要接下来的两列来简单地交换那些和两个。我不知道如何开始这样做。

function [P] = shoes(n)

if n == 1
    P = 1;
elseif n == 2
    P = [1 2; 2 1];
else 
    T = shoes(n-1) + 1;
    G = ones(factorial(n-1),1);
    P(1:2,1:3) = [G T];               
end

2 个答案:

答案 0 :(得分:2)

首先查看the documentation。如果按字典顺序排列,则表示按英文名称字母顺序排列,您可能希望使用名称填充输入,对其进行排序,然后置换。

如果我误解了你的想法,请评论或编辑问题&我稍后会回来查看。

提示:

  • 很容易找到空列表的排列。
  • 归纳是数学中的一个重要概念。你应该熟悉它。
  • 您正在使用的环境支持递归
  • 可以按递归所需的顺序生成较长列表的排列;首先找出你想要的第一个元素,然后弄清楚其余部分。

如果再次陷入困境,请编辑发布到目前为止的内容以及您认为自己被困的地点/原因的问题。

看到你的代码后的提示。

  • 您的核心功能会置换一个向量,因此应将向量作为参数,而不是整数
  • 不要开始解决n = 3案件;尝试n = 0的情况(它是[]),然后直接进入n = 20的情况。
  • 在编写任何代码之前,请考虑n = 20的情况。第一列看起来像什么?在n = 20案件的答案中是否隐藏了n = 19案件的任何例子? (答案是肯定的,它们都不同)。
  • 重读第一组提示

答案 1 :(得分:1)

您似乎已经问过这个问题twice。您只需点击问题下方的“修改”链接并进行更新,而不是重新发布问题。我会在这里转发我给你的另一个问题的答案,但你应该删除其中一个。


如果您有以下矩阵:

A = [1 2 3; 1 3 2];

并且你希望所有的人成为两个人,而两个人成为一个人,以下将是最简单的方法:

B = A;
B(A == 1) = 2;
B(A == 2) = 1;