Ruby中lower_bound是什么?为何这段求最小平方数代码输出为16?
解答你的两个Ruby问题
1. Ruby中的lower_bound是什么?
首先得说,Ruby标准库没有直接提供名为lower_bound的方法——这个概念其实是从C++ STL里过来的,它的作用是在有序集合中找到第一个不小于(大于等于)给定值的元素位置。
不过在Ruby里,我们可以用Array#bsearch方法来实现完全等价的功能。举个实际例子:假设你有一个有序数组,想找到第一个大于等于6的元素,代码可以这么写:
sorted_arr = [1, 3, 5, 7, 9] target = 6 # 用bsearch实现lower_bound逻辑 result = sorted_arr.bsearch { |num| num >= target } puts result # 输出7
这里的bsearch会对有序数组做二分查找,效率很高,当块返回true时,它就会定位到第一个满足条件的元素,完美对应lower_bound的需求。
2. 为什么你的代码运行后输出16?
咱们一步步拆解你的代码逻辑,就能明白为什么传入10会返回16了:
你的函数smallest_square的逻辑是:从i=0开始,不断计算i的平方,直到找到第一个大于传入的lower_bound的平方数,然后返回它。
代入lower_bound=10的执行过程:
- i=0:0*0=0 → 0不大于10,继续
- i=1:1*1=1 → 不大于10,继续
- i=2:2*2=4 → 不大于10,继续
- i=3:3*3=9 → 9还是小于10,继续
- i=4:4*4=16 → 16>10,满足条件,返回16
所以输出16是完全符合代码逻辑的结果~
如果你其实想找的是大于等于lower_bound的最小平方数,结果还是16(因为9<10,下一个平方数就是16)。不过可以给你优化一下代码,用更Ruby化的写法,或者直接用数学方法更高效:
优化写法1(更简洁的循环)
def smallest_square(lower_bound) i = 0 loop do square = i * i return square if square > lower_bound i += 1 end end
优化写法2(数学计算,避免循环)
def smallest_square(lower_bound) sqrt_value = Math.sqrt(lower_bound) # 对平方根向上取整,再平方就是结果 ceil_i = sqrt_value.ceil ceil_i * ceil_i end puts smallest_square(10) # 同样输出16
这样是不是就清楚多啦?
内容的提问来源于stack exchange,提问作者timSully
相关产品推荐
相关产品推荐

