【问题标题】:Binary Search Guessing Game二分搜索猜谜游戏
【发布时间】:2021-09-12 10:55:16
【问题描述】:

我正在尝试创建一个小程序,它使用二进制搜索算法让计算机自己猜测给定一组参数的数字。

函数接受的参数是它必须猜测的“尝试”次数以及它可以猜测的值(例如,5 尝试猜测 0 到 10 之间的数字)。

当我运行我的代码时,它似乎只运行我的 else: 语句,而不管我传入的参数是什么。

我在“if”语句中遗漏了一些东西,但我很困惑,无法弄清楚我做错了什么。

非常感谢您的宝贵时间和帮助!

import random

def guess_random_number_binary(tries, start, stop):
    
    rand_number = random.randint(start,stop)
    num_list = range(start,stop)

    lower_bound = start
    upper_bound = len(str(stop)) - 1
    
    while lower_bound <= upper_bound:
        pivot = (lower_bound + upper_bound) // 2
        pivot_value = num_list[pivot]
    
        if pivot_value == rand_number and tries > 0:
            print("Found it! " + str(rand_number))
            return pivot
        if pivot_value > rand_number and tries > 0:
            upper_bound = pivot - 1
            tries -= 1
            print ("incorrect guess" + str(tries) + " Remaining")
        else:
            lower_bound = pivot + 1
            print("Out of tries")
            return


guess_random_number_binary(5, 0 ,10)

更新:

import random

def guess_random_number_binary(tries, start, stop):
    
    rand_number = random.randint(start,stop)    
    num_list = []

    lower_bound = start
    upper_bound = stop
    
    num_list = range(start,stop+1)
     
    while lower_bound <= upper_bound:
                
        pivot = (lower_bound + upper_bound) // 2
        pivot_value = num_list[pivot]

        if tries > 0:
            if pivot_value == rand_number:
                print("Found it! " + str(rand_number))
                return pivot
            elif pivot_value > rand_number:
                upper_bound = pivot - 1
                tries -= 1
                print ("Guessed " + str(pivot) + " incorrectly \n" +  str(tries) + " Tries remaining")
            elif pivot_value < rand_number:
                lower_bound = pivot + 1
                tries -= 1
                print ("Guessed " + str(pivot) + " incorrectly \n" +  str(tries) + " Tries remaining")
        else:
            print ("Ran out of tries!")
            break


guess_random_number_binary(5, 20 ,30)

我一直在尝试调试,即使我的新代码过于简化,我希望它至少朝着正确的方向前进。

我相信主要问题在于我如何创建“num_list”,正如下面的答案所指出的那样。接收一个 IndexError,这在理论上是有意义的。但是,我似乎找不到创建该列表的替代方法。

再次感谢您。

【问题讨论】:

  • “当我运行我的代码时,它似乎只运行我的 else: 语句,而不管我传入的参数如何。”为什么你认为是这样的?展示一个示例,说明您如何尝试运行程序,确切执行此操作时会发生什么(即您得到什么输出),以及确切应该发生什么(以及为什么)。接下来,自己尝试debug 代码,expected 也是如此。例如,pivot_value 是否具有您期望的值和类型? rand_numbertries 怎么样?
  • 提示:有没有可能pivot_value == rand_number 同时也有pivot_value &gt; rand_number?在pivot_value == rand_number 的情况下,您希望通过循环内的代码采用什么路径?为什么?是否应该阻止else: 块在pivot_value == rand_number 时运行?这是如何工作的?

标签: python algorithm binary-search


【解决方案1】:

您在每个循环开始时重置 pivot 的值,所以

您为stop 传递了值10。所以在upper_bound = len(str(stop)) - 1这一行,

upper_bound = len(str(stop))-1 = len(str(10) = len ('10')-1 = 1。

您的 while 循环永远不会运行,因为 lower_bound 永远不会小于 upper_bound

您可能在某个时候打算写upper_bound = len(num_list)-1,但不知何故写了upper_bound = len(str(stop)) - 1。但是,即使这样也不正确; range(start,stop) 的长度是 stop-start,而不是 stop-start+1(range 不包括 stop)。并且首先使用range 会造成不必要的混乱,并且不适用于更大的start 值。例如,假设(start, stop) = (20, 30)。那么pivot 将是25。但是range 对象将只有10 个元素,所以num_range[pivot] 将返回错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多