Fortran上的递归组合

时间:2015-05-15 14:20:42

标签: recursion fortran fortran90

我在Fortran上编写了一个递归程序来计算npointsndim维的组合,如下所示。我首先在MATLAB上编写了这个程序,它运行得非常好。但是在Fortran中,我的问题是在第一次迭代之后,它为点列表分配了荒谬的值,没有任何解释。有人可以帮我一把吗?

PROGRAM MAIN
   IMPLICIT NONE

   INTEGER :: ndim, k, npontos, contador,i,iterate, TEST
   integer, dimension(:), allocatable :: pontos

   print*, ' '
   print*, 'npoints?'
   read *, npontos
   print*, 'ndim?'
   read *, ndim
   k=1
   contador = 1
   open(450,file= 'combination.out',form='formatted',status='unknown')
   write(450,100) 'Comb  ','stat  ',(' pt ',i,' ',i=1,ndim)
   write(450,120) ('XXXXXXXXXX ',i=1,ndim+1)
   allocate(pontos(ndim)) 
   do i=1,4
   pontos(i)=i
   end do 

   TEST = iterate(pontos, ndim, npontos,k,contador)  



    end program MAIN



       recursive integer function iterate(pontos, ndim, npontos, k,contador)
           implicit NONE
           integer, intent(in) :: ndim, k, npontos
           integer,dimension(:) :: pontos
           integer contador,inic,i,j,m



           if (k.eq.ndim) then

                inic=pontos(ndim)

                do i = pontos(ndim),npontos
                    pontos(k)= i
                    write(*,*) pontos(:)


                    contador=contador+1

                end do

                pontos(ndim)= inic + 1                 
            else

                inic = pontos (k)

                do j = pontos(k),(npontos-ndim+k)

                    pontos(k)=j

                    pontos= iterate(pontos, ndim, npontos, k+1,contador)
                end do
            end if


            pontos(k)=inic+1;
           if (pontos(k).gt.(npontos-ndim+k+1)) then
                do m =k+1,ndim
                    pontos(m)=pontos(m-1)+1
                end do
            end if              


        end function iterate

1 个答案:

答案 0 :(得分:1)

该代码中有太多问题......我停止了调试。这是我到目前为止所做的,这对评论来说太过分了。

这没有意义:

pontos= iterate(pontos, ndim, npontos, k+1,contador)

您正在更改pontos内的iterate,并且从不在函数中设置返回值。

您需要a)为递归函数提供结果语句(并实际设置它)或b)将其转换为子例程。由于您要修改至少一个伪参数,因此应使用b)。

由于您使用的是假定形状的伪参数,因此需要明确或使用模块指定函数/子例程的接口。

您的代码中未指定格式100或格式120