在Ruby中,this代码可以编译:
(Math::PI * 6 .. Math::PI * 6.5).bsearch{|f| Math.cos(f) <= 0.5}
在这种情况下,默认的范围步长是多少?你的情况中没有步骤。浮点数范围不能被迭代。
代码如下:
(Math::PI * 6 .. Math::PI * 6.5).to_a
throws 一个 TypeError:
TypeError: 无法从 Float 迭代
你的代码是有效的,因为 bsearch
并不是通过范围值进行迭代。相反,它“知道”最小值和最大值,并将间隔减半,直到找到一个块 {|f| Math.cos(f) <= 0.5 }
返回 true
的值。
为了查看这一点,您可以添加一个 puts
语句来检查 bsearch
尝试的值:
(Math::PI * 6 .. Math::PI * 6.5).bsearch { |f| puts f; Math.cos(f) <= 0.5 }
Float
限制的范围对象是有效的。但像to_a
一样迭代它是无效的。bsearch
通过将区间减半而不是迭代范围来遍历范围。 - Cristian Lupascubsearch
尝试的值。二分搜索是一种高效的搜索算法,每次搜索都将搜索范围减半。这里有更深入的解释:http://en.wikipedia.org/wiki/Binary_search_algorithm。 - Cristian Lupascu#step
method 来逐步执行它,因为该方法有一个参数表示步长,如果未指定,则默认为1
。 - Cristian Lupascuclass Float; def succ; next_float; end; end
,您可以通过each
迭代浮点数范围。 - AdrianMath.cos(f) <= 0.5
为真的值。这是不正确的。你在结尾显示的测试对我而言打印了数十个步骤,即使在第二步中已经满足Math.cos(f) <= 0.5
(我修改了它以便打印该布尔值)。 - Stefan Pochmann