【问题标题】:Why doesn't this Ruby binary search code work?为什么这个 Ruby 二进制搜索代码不起作用?
【发布时间】:2011-03-21 18:32:25
【问题描述】:

我有这样的代码

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

【问题讨论】:

  • 我真的不明白你的代码。如果您解释了您尝试实现的算法或澄清了您的变量名称(可能使用名词),那么我会更好地提供帮助。
  • 我想找到其他范围内的相同范围。我知道开始在例如 0 和 1000 之间(使用这个参数,我调用第一次函数开始意味着范围开始结束时结束)。比我想在这个范围 (1000+0/)2 中找到中间数字并检查这个数字是否通过有效。如果是,则意味着我的范围号的第一个数字在 0 和 500 之间(在左侧站点 od 划分范围内)。如果不是,则必须在 500 和 1000 之间(划分范围的正确位置)。我想扫描并划分它,直到我得到第一个通过我的有效函数的数字。
  • 我希望函数返回这个数字 temp(我正在搜索的范围的第一个数字)。很抱歉没有早点解释这个

标签: ruby recursion binary-search


【解决方案1】:

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

我想你可能想使用ends / 2 而不是(begins + ends) / 2。这将导致它在您期望的点上为 3745311。

【讨论】:

  • 如果我按照你说的做,我会卡在这个 搜索 3745311- 7490622 搜索 3745311- 7490622
  • 对不起,我的错误我想找到以 a 开头并以 b 结尾的行的中间,所以结果是正确的。
猜你喜欢
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2012-02-22
相关资源
最近更新 更多