代码Kata上的Ruby置换递归

时间:2012-08-17 01:42:24

标签: ruby recursion

通常堆栈溢出是为有形问题保留的,但我正在围绕一个谜题缠绕我想知道是否有人可以解释它。我正在接受递归,并遇到了Dave Thomas的Code Kata(非常酷)。我很乐意制作自己的答案,然后试图减少它们,但有一个我无法弄清楚的答案:

问题:代码卡塔#2 http://codekata.pragprog.com/2007/01/kata_two_karate.html

答案有效,但我无法理解为什么会这样:

def chop(target, values)  
  # Special handling for zero and single element arrays
  return -1 if values.empty?
  return ((target == values[0]) ? 0 : -1) if values.length == 1

  # Try the bottom half first
  pos = chop(target, values[0, values.length/2])
  return pos if pos != -1

  # Then the upper half ... remember that the returned
  # position is relative to the middle of the array.
  pos = chop(target, values[values.length/2, values.length-1])
  return pos + (values.length/2) if pos != -1

  # Didn't find what we were looking for
  return -1
end

任何人都可以向我解释索引如何支持这种递归模式吗?

当我读到它时,它会递归,直到它达到它的数字并返回0.我无法弄清楚为什么这个东西如何吐出指数。

1 个答案:

答案 0 :(得分:0)

我发现像这样处理递归代码的最好方法是从return语句开始。 " return pos + (values.length/2) if pos != -1"线是神奇发生的地方。

用英语重述代码:"将找到的元素的位置(0或正数)添加到原始数组中给定数组的偏移量#34;。

基本上,在回调调用链的过程中会多次调用它,作为最终答案的累加器。要查看此操作,请尝试以下操作:

def chop(target, values)
  return -1 if values.empty?
  if values.length == 1
    return ((target == values[0]) ? 0 : -1)
  end
  pos = chop(target, values[0, values.length/2])
  return pos if pos != -1
  pos = chop(target, values[values.length/2, values.length-1])
  # Print some info
  if pos != -1
    puts [pos, (values.length/2)].inspect
    return pos + (values.length/2)
  end
  return -1
end