当我运行此代码时:
def binarySearch(key, arr, min, max)
if max < min
return -1
else
midpoint = arr[(arr.length-1)/2]
if midpoint < key
binarySearch(key, arr, midpoint, max)
elsif midpoint > key
binarySearch(key,arr, min, midpoint)
else
return midpoint
end
end
end
arr = [0,1,2,3,6,77,23,1133,44,144,232,112]
arr.sort!
binarySearch(144, arr, arr.min, arr.max)
我的堆栈级别太深了错误:
tree.rb:15:in `binarySearch': stack level too deep (SystemStackError)
from tree.rb:15:in `binarySearch'
...
有没有理由在达到正确的区块时找不到return语句?有人建议使用默认值initialize
定义nil
,然后在第一次运行时将其激活。
答案 0 :(得分:1)
1)ruby不需要return语句 - 但递归算法总是如此。但是,这不是你的问题
2) midpoint = arr [(arr.length-1)/ 2]
这个值永远不会改变 - 每次你调用binarySearch时,你总是得到相同的中点值......一遍又一遍......永远....这就是你得到堆栈溢出的原因。 / p>
因为无论你进入堆栈的深度如何,中点始终都是&lt;或者&gt;关键...无论你做什么。
每次都需要做一些不同的事情才能改变一些事情。
注意:当你从binarySearch中调用binarySearch时 - 你正在改变最小/最大值,但不是你计算中点的方式......想一想。
答案 1 :(得分:0)
每次递归时,数组都需要变小。你每次都传递完整的数组,而不只是前半部分或后半部分。
答案 2 :(得分:0)
1)正如其他人所指出的那样,你应该计算当前最大值和最小值之间的中点,而不是基于不会改变的阵列长度。
2)您将中点与键值进行比较。将其更改为中点处的数组值与键值的比较,例如if arr[midpoint] < key
等等。
3)启动搜索,将min和max分别设置为0和arr. length - 1
,而不是arr.min
和arr.max
。