含重复元素的全排列非递归算法?

2 投票
1 回答
1473 浏览
提问于 2025-04-18 12:43

我通常在Python中使用下面的递归算法:

def permutate(array, t, n):             

    if t == n:
       for i in range(n):
            print array[i]

       return

   for j in range(t,n):
      flag = 1
      for r in range(t,j):
          if array[r] == array[j]:
              flag = 0
              break

      if flag == 0:
          continue
      else:
          array[j],array[t] = array[t],array[j]
          permutate(array,t+1,n)
          array[j],array[t] = array[t],array[j]

这个方法挺不错的。

不过我希望能找到一个方便的、不用递归的算法,来处理带有重复元素的全排列。

1 个回答

4

这里有一种通用的方法可以把递归函数变成非递归的方式:假设我们有一个这样的递归函数:

RecFunc (parameters)
    ...
    ...
    var x = RecFunc (other parameters)
    ...
    ...
EndFunc

要把它变成非递归的,你可以使用一个栈,像这样:

NonRecFunc (parameters)
    stack MyStack;
    MyStack.push (InitialValue);
    While (MyStack is non empty)
       var S = MyStack.pop;
       # begin operations with S
       ....
       # results are x_1, ..., x_n
       for x_i = x_1 to x_n
           MyStack.push (x_i);
       endfor
   endWhile
EndFunc

在你的例子中,这个栈里包含了一对东西,一个是数组,另一个是一个整数。初始值是输入的数组和整数 m=0。操作可能看起来像这样:

for i = m to n
    for j = i+1 to n
       if array[i] == array[j]
           continue
       endif
       array_c = copy of array
       permute entries i and j in array_c
       push (array_c, m+1) in the stack
    endfor
endfor

祝你好运!

撰写回答