在sml中实现next_permutation?

时间:2014-12-02 07:47:46

标签: recursion sml smlnj

我如何在SML中实现这一点?是否可以将内部for循环更改为递归内部函数?

void RecursivePermute(char str[], int k) {

 int j;

 // Base-case: All fixed, so print str.
 if (k == strlen(str))
     printf("%s\n", str);

 else {

     // Try each letter in spot j.
     for (j=k; j<strlen(str); j++) {

         // Place next letter in spot k.
         ExchangeCharacters(str, k, j);

         // Print all with spot k fixed.
         RecursivePermute(str, k+1);

         // Put the old char back.
         ExchangeCharacters(str, j, k);
     }
 }

}

1 个答案:

答案 0 :(得分:0)

你可以像

那样写
val rec RecursivePermute = fn (str, k) => ...

fun RecursivePermute (str, k) = ...

您还可以检查k的长度和长度

if (String.size str = k)
then ...
else ...

作为内循环函数,它会以不好的方式工作,所以除此之外做其他事情更好 它涉及String的表示。如果你想交换字符,它将在最坏的情况下工作O(n)n - 字符串的长度(由于你需要删除它们之间的字符,然后将它们放回去)。所以一般来说,你需要使用非常无效的O(n ^ 2)时间。