Algorithm 获取列表的第i个排列
我需要一个fortran代码来计算给定列表{1,2,3,…,n}的第I个置换,而不计算所有的置换,即n!。Algorithm 获取列表的第i个排列,algorithm,fortran,wolfram-mathematica,permutation,fortran90,Algorithm,Fortran,Wolfram Mathematica,Permutation,Fortran90,我需要一个fortran代码来计算给定列表{1,2,3,…,n}的第I个置换,而不计算所有的置换,即n!。 有人能帮我吗?提前谢谢你。我解决了我的问题。下面我将向您展示我实现的Mathematica和Fortran代码。如果您有任何改进建议,请不要发表评论 MATHEMATICA(例如{1,2,3,4,5}的10°置换) FORTRAN SUBROUTINE ith_permutazione(lista_iniziale,n,i,ith_permutation) IMPLICIT NONE IN
有人能帮我吗?提前谢谢你。我解决了我的问题。下面我将向您展示我实现的Mathematica和Fortran代码。如果您有任何改进建议,请不要发表评论 MATHEMATICA(例如{1,2,3,4,5}的10°置换) FORTRAN
SUBROUTINE ith_permutazione(lista_iniziale,n,i,ith_permutation)
IMPLICIT NONE
INTEGER :: j,k,f
INTEGER, INTENT(IN) :: n,i
INTEGER, DIMENSION(1:n), INTENT(IN) :: lista_iniziale
INTEGER, DIMENSION(1:n) :: lista_lavoro
INTEGER, DIMENSION(1:n), INTENT(OUT) :: ith_permutation
lista_lavoro=lista_iniziale
j=i
DO k=1,n
f=factorial(n-k)
ith_permutation(k)=lista_lavoro(FLOOR(REAL(j/f))+1)
lista_lavoro=PACK(lista_lavoro,MASK=lista_lavoro/=ith_permutation(k))
j=MOD(j,f)
ENDDO
ENDSUBROUTINE ith_permutazione
对于较大的数字,以下实现可以防止溢出错误
! Fattoriale
RECURSIVE FUNCTION factorial(n) RESULT(n_factorial)
IMPLICIT NONE
REAL, INTENT(IN) :: n
REAL :: n_factorial
IF(n>0) THEN
n_factorial=n*factorial(n-1)
ELSE
n_factorial=1
ENDIF
ENDFUNCTION factorial
! ith-permutazione di una lista
SUBROUTINE ith_permutazione(lista_iniziale,n,i,ith_permutation)
IMPLICIT NONE
INTEGER :: k,n
REAL :: j,f
REAL, INTENT(IN) :: i
INTEGER, DIMENSION(1:n), INTENT(IN) :: lista_iniziale
INTEGER, DIMENSION(1:n) :: lista_lavoro
INTEGER, DIMENSION(1:n), INTENT(OUT) :: ith_permutation
lista_lavoro=lista_iniziale
j=i
DO k=1,n
f=factorial(REAL(n-k))
ith_permutation(k)=lista_lavoro(FLOOR(j/f)+1)
lista_lavoro=PACK(lista_lavoro,MASK=lista_lavoro/=ith_permutation(k))
j=MOD(j,f)
ENDDO
ENDSUBROUTINE ith_permutazione
我不懂Fortran,也不懂Mathematica,但为Scala开发了这样一种算法——也许你可以阅读并介绍它:[我建议你更努力地寻找一个更程序化的起点,除非你想编写一个递归Fortran函数。在这种情况下,尝试一下,看看你在哪里遇到了困难。
! Fattoriale
RECURSIVE FUNCTION factorial(n) RESULT(n_factorial)
IMPLICIT NONE
REAL, INTENT(IN) :: n
REAL :: n_factorial
IF(n>0) THEN
n_factorial=n*factorial(n-1)
ELSE
n_factorial=1
ENDIF
ENDFUNCTION factorial
! ith-permutazione di una lista
SUBROUTINE ith_permutazione(lista_iniziale,n,i,ith_permutation)
IMPLICIT NONE
INTEGER :: k,n
REAL :: j,f
REAL, INTENT(IN) :: i
INTEGER, DIMENSION(1:n), INTENT(IN) :: lista_iniziale
INTEGER, DIMENSION(1:n) :: lista_lavoro
INTEGER, DIMENSION(1:n), INTENT(OUT) :: ith_permutation
lista_lavoro=lista_iniziale
j=i
DO k=1,n
f=factorial(REAL(n-k))
ith_permutation(k)=lista_lavoro(FLOOR(j/f)+1)
lista_lavoro=PACK(lista_lavoro,MASK=lista_lavoro/=ith_permutation(k))
j=MOD(j,f)
ENDDO
ENDSUBROUTINE ith_permutazione