首页 > 解决方案 > Python 3.x 短内存数猜测(编程/数学)

问题描述

(这可能是一个编程问题和一个数学问题,但先在这里发布。)

我做了一个简单的程序,在计算机和它自己之间玩猜谜游戏。它生成一个介于 0 到 100 之间的数字,然后从另一个函数中获取猜测。该程序可以工作,但非常不精确,因为猜测函数只知道最后一次猜测以及它应该猜测更高还是更低。(现在它只是在最后一次猜测和最低/最高界限之间随机化一个 int 。)

最简单的解决方案是 withif-else但我更喜欢条件尽可能少的解决方案。

我想知道是否有办法让猜测函数在只知道最后一次猜测的情况下逐渐缩小猜测的宽度,是否应该猜测更高或更低以及猜测的最大和最小界限?

当前代码:

import random as rnd
def guess_me_computer(number = None, guess = 50, turns = 0, memory = []): 
    """Guessing game between two computers.

    Args:
        number: Number to be guessed
        guess: Guess made by computer
        turns: How many guesses made so far
        memory: List storing how many turns each run takes
    """
    turns += 1

    if number == None:
        number = rnd.randint(0, 100)

    if guess == number:
        print("Correct! My number: {number} was guessed in {turns} tries!".format(number = number, turns = turns))
        memory.append(turns) #Memory used in another testing function
        return None
    elif guess < number:
        print("Wrong! Guess Higher!")
        guess_me_computer(number = number, guess = guesser_computer(last_guess = guess, higher = True), turns = turns, memory = memory)
    else:
        print("Wrong! Guess Lower!")
        guess_me_computer(number = number, guess = guesser_computer(last_guess = guess, higher = False), turns = turns, memory = memory)


def guesser_computer(last_guess = None, higher = None):
    if higher:
        return rnd.randint(last_guess, 100)
    else:
        return rnd.randint(0, last_guess)

非常欢迎有关问题本身和/或对写作的批评的任何和所有问题。

标签: pythonpython-3.xfunctionmathrecursion

解决方案


虽然这对于学习递归来说不是一个大问题,但对于学习生成器,尤其是它们的.send()方法来说,这可能是一个有趣的问题。下面的生成器仍然只知道最后的猜测,但它也会从调用它的程序中得到提示,无论猜测是太高还是太低:

from random import randint

def guess_me_computer(guesser):
    number = randint(1, 100)
    tries = 1
    too_low = None
    guess = next(guesser)

    while True:
        if guess == number:
            print("Number: {} guessed in {} tr{}!".format(number, tries, ["ies", "y"][tries == 1]))
            return

        if guess < number:
            print("Wrong! {} is too low! Guess Higher!".format(guess))
            too_low = True
        else:
            print("Wrong! {} is too high! Guess Lower!".format(guess))
            too_low = False

        tries += 1
        guess = guesser.send(too_low)

def guesser_computer(minimum=1, maximum=100):
    while True:
        guess = randint(minimum, maximum)
        higher = yield guess

        if higher:
            minimum = guess + 1
        else:
            maximum = guess - 1

generator = guesser_computer()
guess_me_computer(generator)

推荐阅读