首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二分搜索猜谜游戏

二分搜索猜谜游戏
EN

Stack Overflow用户
提问于 2021-09-12 00:53:26
回答 1查看 89关注 0票数 0

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

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

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

我在"if“语句中遗漏了一些东西,但我被难住了,无法找出我做错了什么。

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

代码语言:javascript
复制
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)

更新:

代码语言:javascript
复制
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,这在理论上是有意义的。然而,我似乎找不到创建该列表的替代方案。

再一次感谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-12 01:24:04

您将在每次循环开始时重置pivot的值,因此

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

upper_bound = len (字符串(停止))- 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]将返回一个错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69147709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档