具有重复元素的完全置换的非递归算法?

时间:2014-07-09 23:27:04

标签: python algorithm permutation

我通常在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 个答案:

答案 0 :(得分:4)

这是" un-recursify"的通用方法。递归函数:让我们说我们有以下递归函数:

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

To" un-recursify"它,你可以使用这样的堆栈:

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

在您的情况下,堆栈包含一个由数组和int组成的对。初始值是输入中的数组,int 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
祝你好运!