2015-02-10 58 views
0

我必须为给定数组找到所有没有重复的组合(nCr)。例如,如果数组=位置=(/ 1,2,3,4,5 /),并且我想找到3的组合(这里,r = 3),则所有的组合是: (1 2 3; 1 2 4; 1 2 5; 1 3 4; 1 3 5; 1 4 5; 2 3 4; 2 3 5; 2 4 5; 3 4 5)通用计算机代码查找组合,无需重复

我问题是将这个过程概括为r的任何值。根据我当前的代码, ,for循环的数量随着r的增加而增加。 有没有可能用fortran将这个过程推广到任何r?

我为R = 3

program combinations 

integer i,j,k,l 
integer loc1,loc2,loc3 
integer, dimension(5) ::positions 

positions = (/ 1, 2, 3, 4, 5/) 

do i =1,5 
loc1 = positions(i) 
    do j =1,5 
    if (j .gt. i) then 
    loc2 = positions(j) 
    do k=1,5 
     if (k .gt. j) then 
     loc3 = positions(k) 

     write(*,*) loc1,loc2,loc3 

    endif 
    enddo 
    endif 
enddo 
enddo 

end program 

`

+1

除了标签之外,还有其他的python吗? – 2015-02-10 12:04:13

+0

Python [组合](https://docs.python.org/2/library/itertools.html#itertools.combinations)函数文档包含通用的python算法。 – Slam 2015-02-10 12:11:36

+0

删除Python标记?你只想在Fortran中使用它? – thiruvenkadam 2015-02-10 12:13:08

回答

0

在蟒蛇的情况下,当前的代码, “有因任何一个内置的方法” ;-)

from itertools import combinations 
list(combinations(range(1, 6), 3)) 
# Output will be [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)] 

有fun :-)

+0

非常感谢! – Gihan 2015-02-10 12:42:58

0
COMMON ICOUNT 
    CHARACTER *70 OFIL 
    OFIL='ALLCOMB.TXT' 
    WRITE(*,*)'FEED N AND M (NOTE: N OR M LARGER THAN 20 TAKES TIME)' 
    READ(*,*) N,M 
    WRITE(*,*)'FEED FILE NAME TO STORE RESULTS' 
    READ(*,*) OFIL 
    ICOUNT=0 
    CALL COMBIN(N,M,OFIL) 
    WRITE(*,*)'OVER' 
    END 
    !--------------------------------------------------------------- 
    SUBROUTINE COMBIN(N,M,OFIL) 
    PARAMETER (MX=20)! MX IS MAXIMUM DIMENSION 
    ! Program by SK Mishra http://skmishra.net/computer-programs/comb.txt 
    COMMON ICOUNT 
    INTEGER A(MX),B(MX),C 
    DOUBLE PRECISION NCM,IC 
    CHARACTER *70 OFIL 
    OPEN(15,FILE=OFIL) 
    NCM=1 
    DO I=1,M 
    A(I)=I ! A IS LEAST INDEXED COMBINATION 
    B(I)=N-M+I ! B IS MAXIMUM INDEXED COMBINATION 
    NCM=NCM*B(I)/I ! TOTAL POSSIBLE COMBINATIONS 
    ENDDO 
    IF(M.GT.0) THEN 
    ICOUNT=ICOUNT+1 
    WRITE (15,*) (A(I),I=1,M), ICOUNT! INITIAL (LEAST INDEXED) COMBINATION 
    ELSE 
    WRITE(15,*) 'NONE' 
    ENDIF 
    INCMPL=1 
    IC=1 
    ! -------------------------------------------------------------- 
    DO WHILE (INCMPL.NE.0 .AND.INT(IC).LT.NCM) 
    INCM=0 
    DO I=1,M 
    INCM=INCM+(B(I)-A(I)) 
    ENDDO 
    INCMPL=INCM 
    A(M)=A(M)+1 
    DO I=1,M 
    II=M-I+1 
     IF(A(II).GT.B(II)) THEN 
     A(II-1)=A(II-1)+1 
     DO J=II,M 
     A(J)=A(J-1)+1 
     ENDDO 
     ENDIF 
    ENDDO 
    IC=IC+1 
    ICOUNT=ICOUNT+1 
    WRITE(15,*)(A(K),K=1,M),ICOUNT 
    ENDDO ! END DO WHILE LOOP 
    ! -------------------------------------------------------------- 
    CLOSE(15) 
    RETURN 
    END 
+0

这段代码做了什么?建议我发布,而不仅仅是一些代码dummp,但也有一些解释。 – 2017-11-06 07:20:31