我有一些递归作业,我真的很困。任务是创建一个程序,在其中输入上下边界以及这些边界内的数字。程序应计算这些边界的中间数。如果中间数字大于数字,则中间数字成为下边界,如果更低,则成为上边界。直到选择正确的数字为止。相同的那一刻,程序停止并返回它。
这是我已经编写的代码,但是仅当数字的第一个猜测正确时,它才有效:
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。只能通过递归来完成。
答案 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