递归方法中的堆栈级别太深

时间:2015-03-17 05:04:51

标签: ruby recursion

当我运行此代码时:

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,然后在第一次运行时将其激活。

3 个答案:

答案 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.minarr.max