使用递归猜测数字

时间:2019-05-23 14:57:28

标签: python python-3.x recursion

我有一些递归作业,我真的很困。任务是创建一个程序,在其中输入上下边界以及这些边界内的数字。程序应计算这些边界的中间数。如果中间数字大于数字,则中间数字成为下边界,如果更低,则成为上边界。直到选择正确的数字为止。相同的那一刻,程序停止并返回它。

这是我已经编写的代码,但是仅当数字的第一个猜测正确时,它才有效:

def number_guess(number ,upper_boundary, lower_boundary):
    boundary_dif = upper_boundary - lower_boundary
    middle_number = boundary_dif/2 + lower_boundary
    if middle_number == number:
        return middle_number
    if middle_number > number:
        middle_number = lower_boundary
        number_guess(number, upper_boundary, lower_boundary)
    if middle_number < number:
        middle_number = upper_boundary
        number_guess(number, upper_boundary, lower_boundary)

P.S。只能通过递归来完成。

2 个答案:

答案 0 :(得分:1)

递归可能需要一段时间才能得到。我将调查binary search的工作方式:

def number_guess(number, lower, upper):
    middle = ((upper - lower) // 2) + lower
    if middle == number:
        return middle
    if number > middle:
        return number_guess(number, middle, upper)
    return number_guess(number, lower, middle)

print(number_guess(57, 0, 100))

答案 1 :(得分:1)

这小段代码有很多问题。首先是常见的递归编程错误。您的递归函数返回一个值:

if middle_number == number:
    return middle_number

但是当您递归调用它时,您将忽略该返回值:

if middle_number > number:
    middle_number = lower_boundary
    number_guess(number, upper_boundary, lower_boundary)

如果返回值,则必须处理它。在这种情况下,解决方案很简单,只需依次返回即可:

    return number_guess(number, upper_boundary, lower_boundary)

下一个问题是两个极限测试倒退了:

if middle_number > number:
    middle_number = lower_boundary

如果中间数字大于数字,则它应该是新的上限,而不是下限。与upper_boundary测试相同。接下来,此分配是向后的:

middle_number = lower_boundary
return number_guess(number, upper_boundary, lower_boundary)

此后我们不再使用middle_number,而是使用lower_boundary递归,所以我们应该这样做:

lower_boundary = middle_number
return number_guess(number, upper_boundary, lower_boundary)

或者,我们可以简单地做到:

return number_guess(number, upper_boundary, middle_number)

同上为upper_boundary代码。接下来,您将其标记为Python 3,因此代码如下:

boundary_dif/2

将生成一个不需要的浮点数!您需要:

boundary_dif // 2

最后,尽管可行:

boundary_dif = upper_boundary - lower_boundary
middle_number = boundary_dif // 2 + lower_boundary

它也可以简单表示为:

middle_number = (upper_boundary + lower_boundary) // 2