Fortran Coder

标题: 递归函数运行,输入数据后,没报错但程序不动 [打印本页]

作者: xiejihong0306    时间: 2022-10-8 11:17
标题: 递归函数运行,输入数据后,没报错但程序不动
本帖最后由 xiejihong0306 于 2022-10-8 11:36 编辑

彭国论教材EX0829.F90,用递归函数实现阶乘。


可我遇到了下面这个问题,按照粘贴的源代码那样,运行后输入n!,程序没报错,也没输出结果,想了半天实在没看懂哪有问题,


如果可以的话,想请高人解惑,万分感谢

-----------------------------

补充:  不好意思题干描述有点问题,我输入的9 ,没加感叹号


[Fortran] 纯文本查看 复制代码
! NOTE:P209
!  A sample code that reveals the principle of recursive functions and the calculation process
      program ProgramName
      implicit none
      integer ExitKey

      integer(kind=4) :: n
      integer(kind=4), external :: fact
      write(unit=6, fmt="('N = ')")
      read (unit=5, fmt=*) n
      write(unit=6, fmt="(I3,'! = ', I8)") n, fact(n)

! Avoid having the command window exit before the results are output
      write ( *, *) 'Press input any words to exit...'
      read ( *, *) ExitKey
      stop
      end program ProgramName


      recursive integer(kind=4) function fact(n) result(ans)
        implicit none
        integer(kind=4), intent(in) :: n
        integer(kind=4), save :: count = 1
        integer(kind=4) :: localcount, temp
        localcount = count
        count = count + 1
        write(unit=6, fmt="(I2, 'th enter, n = ', I2)") localcount, n
        !  The IF-ELSE combination of multiple judgments only executes the first module that matches the condition
        !  and then jumps to END IF to leave the statement.
        if ( n < 0 ) then
          ans = -1
          write(unit=6, fmt="(I2, 'th exit, n = ', I2, 'ans = ', I8)") localcount, n, ans
          return
        else if ( n <=1 ) then
          ans = 1
          write(unit=6, fmt="(I2, 'th exit, n = ', I2, 'ans = ', I8)") localcount, n, ans
          return
        end if
        temp = n - 1
        ans = n * fact(temp)
        write(unit=6, fmt="(I2, 'th exit, n = ', I2, 'ans = ', I8)") localcount, n, ans
        return
      end function fact




















作者: Transpose    时间: 2022-10-8 11:17
本帖最后由 Transpose 于 2022-10-8 11:28 编辑

gfortran的函数里面写输出会发生混乱,ifort应该没这个问题
[Fortran] 纯文本查看 复制代码
      integer(kind=4) :: n
      integer(kind=4), external :: fact
      integer::f
      write(unit=6, fmt="('N = ')")
      read (unit=5, fmt=*) n
      f=fact(n)
      write(unit=6, fmt="(I3,'! = ', I8)") n, f

     不要同时输出即可
作者: 布衣龙共    时间: 2022-10-8 11:25
本帖最后由 布衣龙共 于 2022-10-8 11:27 编辑

输入 3 就行了。不要输入 3!

此外,可能存在递归IO占用问题,详解:
http://recursiveio.w.fcode.cn/
作者: xiejihong0306    时间: 2022-10-8 11:36
布衣龙共 发表于 2022-10-8 11:25
输入 3 就行了。不要输入 3!

此外,可能存在递归IO占用问题,详解:

不好意思我题干描述有点问题,我输入的9 ,没加感叹号
作者: xiejihong0306    时间: 2022-10-8 11:42
Transpose 发表于 2022-10-8 11:17
gfortran的函数里面写输出会发生混乱,ifort应该没这个问题
[mw_shl_code=fortran,true]      integer(kind= ...

牛逼,分开写之后完美解决了,原来是gFortran输出混乱的问题,谢谢你!

--------------------------------

N =
5
1th enter, n =  5
2th enter, n =  4
3th enter, n =  3
4th enter, n =  2
5th enter, n =  1
5th exit, n =  1ans =        1
4th exit, n =  2ans =        2
3th exit, n =  3ans =        6
2th exit, n =  4ans =       24
1th exit, n =  5ans =      120
  5! =      120
Press input any words to exit...







欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2