gpt4 book ai didi

arrays - 使用 Fortran 进行数组问题的二分查找

转载 作者:行者123 更新时间:2023-12-02 05:37:05 26 4
gpt4 key购买 nike

我正在使用 Schaum 的《Fortran 77 编程概要》一书,其中有一个关于使用括号值组方法进行二分搜索的示例。首先是代码:

    INTEGER X(100)
INTEGER RANGE
INTEGER START , FINISH

PRINT *, 'Number of values ?'
READ *, N
DO 10 I = 1, N
READ *, X(I)
END DO

PRINT *, 'Enter Value'
READ *, VAL

START = 1
FINISH = N
RANGE = FINISH - START
MID = (START + FINISH) /2

DO WHILE( X(MID) .NE. VAL .AND. RANGE .NE. 0)
IF (VAL .GT. X(MID))THEN
START = MID
ELSE
FINISH = MID
END IF
RANGE = FINISH - START
MID = (START + FINISH)/2
END DO

IF( X(MID) .NE. VAL) THEN
PRINT *, VAL, 'NOT FOUND'
ELSE
PRINT *, 'VALUE AT' , MID
END IF
END

问题是,当我输入 7 个值数组时

2 | 9 | 11 | 23 | 49 | 55 | 66

例如搜索 66,当

MID = 5

,下一次循环的新 MID 变为 6 。但是当它是 6 时,它无法在下一个循环中增加,因为

MID = (START + FINISH)/2 = (6+7)/2 = 6

当然应该是 7。

它仍然是 6。当然,我的程序永远不会给我输出。我在这里做什么?

最佳答案

这只是一个拼写错误,或者可能有人在从 C 版本翻译它时感到困惑,并且不得不更改索引。

循环中的关键不变量是,如果值在列表中,则该值必须落在数组中从索引开始到结束(包括索引)的某个位置。但是一旦你排除了mid,它就应该从列表中删除。但它不在这里,所以列表总是太长,您会遇到您所看到的问题。

正确的版本将开始设置为 mid+1,或将结束设置为 mid-1,以排除 mid。更正后的代码,以 Fortran 90 风格编写:

program binarysearch

implicit none
integer, allocatable, dimension(:) :: x
integer :: range, start, finish, mid
integer :: i, n, val

print *, 'Number of values ?'
read *, N
allocate( x(N) )

do i = 1, n
READ *, x(i)
end do

print *, 'Enter Value'
read *, VAL

start = 1
finish = N
range = finish - start
mid = (start + finish) /2

do while( x(mid) /= val .and. range > 0)
if (val > x(mid)) then
start = mid + 1
else
finish = mid - 1
end if
range = finish - start
mid = (start + finish)/2
end do

if( x(mid) /= val) then
print *, val, 'NOT FOUND'
else
print *, 'VALUE AT' , mid
end if

deallocate( x )

end program binarysearch

关于arrays - 使用 Fortran 进行数组问题的二分查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com