【问题标题】:Getting the ith permutation of a list获取列表的第 i 个排列
【发布时间】:2016-02-22 01:31:43
【问题描述】:

我需要一个 fortran 代码来计算给定列表 {1,2,3,...,n} 的第 i 个排列,而不计算所有排列,即 n!。 有没有人可以帮助我?提前谢谢你。

【问题讨论】:

  • 我不知道 Fortran,也不知道 Mathematica,但是为 Scala 开发了这样一个算法——也许你可以阅读并重现它:[stackoverflow.com/a/8958309/312172]
  • 我建议您更加努力地寻找更程序化的起点,除非您想编写递归 fortran 函数。在这种情况下,请尝试一下并显示您卡在哪里。

标签: algorithm fortran wolfram-mathematica permutation fortran90


【解决方案1】:

我解决了我的问题。下面我将向您展示我实现的 Mathematica 和 Fortran 代码。如果您有任何改进建议,请不要发表评论。

MATHEMATICA(例如:{1,2,3,4,5} 的 10° 排列)

n = 5;
i = 10;
p = Range[n];
ithPermutation = p;
Do[f = (n - k)!;
d = Floor[i/f];
ithPermutation[[k]] = p[[d + 1]];
p = Drop[p, {d + 1}];
i = Mod[i, f], {k, 1, n}];

福特兰

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

【讨论】:

    【解决方案2】:

    对于大数字,以下实现可以防止溢出错误。

            ! 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2021-08-22
      • 2021-12-09
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      相关资源
      最近更新 更多