使用布尔变量时,while循环不会停止吗?

时间:2018-09-27 08:50:25

标签: python algorithm recursion search binary-search

我正在尝试在python中编写递归二进制搜索算法。但是,我一直遇到一个无限的while循环。恐怕这一定是我所忽略的简单事物,但是我无法在任何地方找到答案,有关while循环不终止的大多数问题的确使用其他条件,而不是布尔值。

该算法似乎确实有效,它会打印我要搜索的元素的索引,或者当该元素不在列表中时显示“找不到值”。但是while循环永远不会终止,即使我在找到/未找到值后将found设置为False。为什么会这样?

Observable.fromCallable((Callable<Object>) () ->
                    statisticsViewModel.addStatistics(new Statistics())
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(o -> {
                        // Triggering two times
                    });

2 个答案:

答案 0 :(得分:2)

您正在使用found修改的found = False变量在该特定递归调用binarysearch的范围内是 local 。它不是您要尝试进行修改的found的实例,即递归树的顶层实例。因此,尽管当前作用域中的while循环将终止,但其上方作用域中的循环不会终止。

由于您已经有了一个几乎完整的循环实现,因此不必在其之上使用递归(这会导致与范围相关的错误),您可以通过覆盖x和{{1}来缩小搜索范围}。

y

答案 1 :(得分:0)

我犯的错误是我在递归调用的顶部使用了while循环,这基本上是完成相同操作的两种方法。对于那些对使用递归而不是使用while循环来保持运行的算法感兴趣的人,我在下面提供了它的有效版本。

def binarysearch(A, v, x, y):
    if x < y:
        h = (x+y) //2
        if A[h] < v:
            binarysearch(A, v, h+1, y)
        else:
            binarysearch(A, v, x, h)
    elif A[x] == v:
        print("Element you are looking for is at index {}".format(x))
    else:
        print("Value is not in array")