通常堆栈溢出是为有形问题保留的,但我正在围绕一个谜题缠绕我想知道是否有人可以解释它。我正在接受递归,并遇到了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.我无法弄清楚为什么这个东西如何吐出指数。
答案 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