使用重复算法进行排列?

时间:2014-03-09 17:48:13

标签: fortran

我正在尝试在Fortran中编写一个代码,生成给定以下输入1,2,3生成重复的排列:

111 112 113 121 122 123 。 。

显然会有3 ^ 3 = 27(n ^ k)组合。有谁知道生成这样的东西的算法?

1 个答案:

答案 0 :(得分:3)

这是一个解决方案:

module perm_mod
contains
  subroutine print_permutations(A)
    implicit none
    integer,intent(in)    :: A(:)
    integer               :: i, j, l, remainder
    integer               :: idx(size(A,1)), stride(size(A,1))

    l = size(A,1)

    stride(1) = 1
    do i=2,l
      stride(i) = stride(i-1)*l
    enddo ! i

    do i=0,l**l-1
      remainder = i
      do j=l,1,-1
        idx(j) = remainder / stride(j)
        remainder = remainder - idx(j)*stride(j)
      enddo ! j
      print *,A(idx+1)
    enddo ! i

  end subroutine
end module

program perm
  use perm_mod
  implicit none
  integer,parameter :: A(3) = [ 1, 2, 3 ]

  call print_permutations(A)
end program