Fortran Coder

标题: 递归求n!阶乘 [打印本页]

作者: excavator    时间: 2023-8-5 10:32
标题: 递归求n!阶乘
请问为什么一直提示“Variable "n" masks variable in parent scope[行:9,列:18]”?当然不建议在返回单个数字的时候用interface,这段代码只是练习
[Fortran] 纯文本查看 复制代码
program recursive_test
    implicit none

    INTEGER :: n
    interface
      RECURSIVE INTEGER function fact(n) result(ans)
        LOGICAL :: count
        INTEGER :: n
      end function fact
    end interface
    write (*, "('N = ', I3)")
    read (*, *) n
    write (*, "(I3, '! = ', I8)") n, fact(n)

    stop
  end program recursive_test

  RECURSIVE INTEGER function fact(n) result(ans)
    implicit none

    INTEGER :: n
    LOGICAL :: count

    if (n < 0) then
      ans = -999
      count = .false.
      return
    else if (n <= 1) then
      ans = 1
      count = .true.
      return
    end if

    ans = n*fact(n - 1)

    return
  end function fact




作者: excavator    时间: 2023-8-5 16:54
找到原因了,主程序有一个叫n的变量,子程序中也有一个,所以会警告但不报错,只要把变量的名字改一下就好了
作者: fcode    时间: 2023-8-6 17:00
没问题呀,主程序里面有 n,不影响子程序里面有 n 的。你的代码我这里运行毫无问题。

尽管你的代码没有问题,但有一些语句没有必要。帮你注释出来。

[Fortran] 纯文本查看 复制代码
program recursive_test
    implicit none
    INTEGER :: n
    interface
      RECURSIVE INTEGER function fact(n)! result(ans)
        !LOGICAL :: count 不必要
        INTEGER :: n
      end function fact
    end interface
    write (*, "('N = ', I3)")
    read (*, *) n
    write (*, "(I3, '! = ', I8)") n, fact(n)
    ! stop 不必要
  end program recursive_test

  RECURSIVE INTEGER function fact(n) result(ans)
    implicit none
    INTEGER :: n
    !LOGICAL :: count
    if (n < 0) then
      ans = -999
      !count = .false.
      !return
    else if (n <= 1) then
      ans = 1
      !count = .true.
      !return
    else
      ans = n*fact(n - 1)      
    end if
    !return
  end function fact





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