function max(arr, first, last){
if (first==last) return arr[first];
mid=first+(last-first)/2;
a=max(arr, first,mid);
b=max(arr, mid+1,last);
if (a<b) return b;
return a;
}
我无法理解这个递归函数,因为在分配变量时我真的不明白流程是如何工作的。我的理解是,当a=max(arr, first,mid);
a将继续调用函数直到基本情况发生时 - 所以我可以安全地假设发生这种情况
b=max(arr, mid+1,last);
if (a<b) return b;
return a;`
直到'a'完成呼叫才会执行?当流程达到“b”并开始递归调用时,它是否会影响a=max(arr, first,mid);
- 因为它会将不同的值应用于?
我在上下文中找到最大值的理解是a会在前半部分找到最大元素而b会在后半部分找到最大元素但是我不明白它在{{1}时是如何做到的直到最后当a和b有值时才调用},我的想法是它会检查这个,以便它可以找到a中的最大值和b中的最大值,然后比较两半的最大值以找到最大元素在arr?
对不起,如果Q模糊,我只是想更好地理解递归
答案 0 :(得分:2)
您正在尝试通过逐步跟踪它来了解它的工作原理,一直追逐每一个电话。不要这样做,这令人困惑。
查看一个调用的内容,而不必担心当前调用max()
调用的函数会发生什么。是的,它自称,甚至两次。这两个调用都是返回值的函数调用,就max()
的当前调用而言,它们也可能只是数字。
如果我用以下内容替换了分配a
和b
的行:
a = 13;
b = 42;
那么你就不会理解它的作用。如果我用它替换它们:
a = max_implemented_with_a_for_loop(arr, first, mid);
b = max_implemented_with_a_for_loop(arr, mid+1, last);
那么你也不会遇到麻烦。递归版本并不是那么不同。
像这样的递归函数通过解决一个大问题,将其分成更小的子问题,解决子问题,并结合解决方案来解决大问题。它用它来解决子问题,如果我们没有基本情况,那就会有一个障碍 - 有一点你不能再进一步细分问题了,你需要另一种解决方法这些微小的子问题。但这不是一个障碍,因为一个太小而不能再分裂的子问题很容易解决。基本情况只是注意到我们已经有了一些容易直接解决的事情和/或无法进一步分割并处理它。
答案 1 :(得分:0)
每个递归调用都有一个较小的非负值,即last-first。因此,如果第一个调用具有last-first的非负值,则每个调用(包括第一个调用)都将终止。
如果last == first,则返回范围中唯一的元素作为最大值。
否则返回前半部分(a)的最大值和后半部分的最大值(b)中的较大者。
在任何一种情况下,都会正确计算最大值,并且没有其他情况。