【发布时间】:2021-05-10 07:14:28
【问题描述】:
我尝试在 Fortran 95 中使用递归函数实现二进制搜索。
我的错误信息是:/usr/bin/timeout: the monitoring command dumped core
有人知道我该如何解决这个问题吗?
这个小程序的返回值应该是2。
另外:如何扩展我的代码以返回数组“ar”的位置编号以知道我可以在哪里添加我的新元素(即“2.9”)?如果是 2.9,它应该返回 2。另一个例子,如果我使用 7.3 而不是 2.9,它应该返回 6(在数组“ar”的 7.0 和 8.0 之间)。
program h
real, dimension(7) :: ar
integer :: s
real :: outp
ar = (/2.0, 3.0, 4.0, 5.0, 7.0, 8.0, 9.0/)
s = sizeof(ar)
outp = findAr(ar, 1, s, 3.0)
print*, outp
end program h
recursive function findAr(ar, l, r, x) result(a)
real, dimension(size(ar)), intent(in) :: ar
integer, intent(in) :: l, r
real, intent(in) :: x
integer :: midd
real :: a
if (r >= 1) then
midd = l + (r - 1) / 2
if (ar(midd) == x) then
a = midd
else if (ar(midd) > x) then
a = findAr(ar, l, midd - 1, x)
else
a = findAr(ar, midd + 1, r, x)
end if
end if
end function findAr
【问题讨论】:
-
real, dimension(size(ar)), intent(in) :: ar试图说'将 ar 声明为一个数组,其大小由其大小决定'。对可怜的编译器说这不是一件好事。你想发生什么。我猜你的意思是dimension(:)甚至dimension(*)但如果你能澄清一下会很有帮助。 -
如果Dimension(:)你还需要一个范围内的接口,我认为你也需要递归例程——所以把所有子程序都放在模块中,然后你就不用担心了关于当前的规则是什么。
-
如果使用递归函数,则需要显式接口。
-
当然你在 Fortran 90-2008 中做过。鉴于截至 2018 年,所有例程默认情况下都是递归的,我不确定要求是否已放宽。但在调用任何例程时,无论是否递归使用,在范围内都有一个接口绝对是最佳实践