为什么这个Ruby二进制搜索代码不起作用?

时间:2011-03-21 18:32:26

标签: ruby recursion binary-search

我有这样的代码

def search(begins, ends)
  puts "Searching for  #{begins}- #{ends}"
  temp = ((begins + ends) / 2).to_i
  if is_valid? temp
    if (ends - begins).abs < 3 # the result is between a and 2 digits than b
      return temp # recursion ends
    else
      search(begins, temp)
    end
  else
    search(temp, ends)
  end
end

0到10000000之间有一系列数字传递is_valid函数。我想找到使用此代码传递此函数的第一个和最后一个元素,但它不起作用它甚至不接近。它进入无限循环,这里有几行输出

Searching for  0- 14981245
Searching for  0- 7490622
Searching for  3745311- 7490622
Searching for  3745311- 5617966 # good result
Searching for  3745311- 4681638
Searching for  3745311- 4213474
Searching for  3745311- 3979392
Searching for  3745311- 3862351
Searching for  3745311- 3803831
Searching for  3745311- 3774571
Searching for  3759941- 3774571
Searching for  3759941- 3767256
Searching for  3759941- 3763598
Searching for  3759941- 3761769
Searching for  3759941- 3760855
Searching for  3760398- 3760855
Searching for  3760626- 3760855

1 个答案:

答案 0 :(得分:0)

查看您编写的代码:其中的任何内容都不会导致ends在您声明的位置接近3745311。 3745311 + 7490622是11235933,除以2给我们5617966,就像你看到的一样。 5617966 - 3745311远大于3,所以它再计算3745311 + 5617966,即4681638 - 就像你看到的一样。

我想也许你想使用ends / 2而不是(begins + ends) / 2。这将使你在期待的时候成为3745311。