繁体   English   中英

难以理解多个递归调用

[英]Difficulty understanding multiple recursive calls

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应用不同的值?

我对找到最大值的理解是a将在上半部分找到最大元素,b将在下半部分找到最大元素,但是当if (a<b) return b; return a;时,我不知道它如何做到这一点if (a<b) return b; return a; if (a<b) return b; return a; 直到最后a和b都具有值时才被调用,我以为它将对其进行检查,以便它可以找到a中的最大值和b中的最大值,然后比较两个半部的最大值以找到in中的最大元素。啊?

抱歉,如果Q模糊,我只是想更好地理解递归

您试图通过逐步跟踪,跟踪所有单个呼叫来了解其工作原理。 不要那样做,这很令人困惑。

查看一个调用的作用,而不必担心当前调用max()会在函数中发生什么。 是的,它会自称,甚至两次。 这两个调用都是返回值的函数调用,就当前调用max()而言,它们也可能只是数字。

如果我将分配ab的行替换为:

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);

那么您也不会遇到任何麻烦。 递归版本没有什么不同。

像这样的递归函数通过处理一个大问题,将其分为较小的子问题,解决子问题,并组合解决方案来解决该大问题。 它使用自身来解决子问题,如果我们没有基本案例,则会遇到障碍-有时您无法进一步细分问题,并且您需要另一种解决这些小子问题的方法。 但这并不是一个小问题,因为子问题太小而无法分解,因此很容易解决。 基本情况只是注意到我们有容易直接解决的问题和/或无法进一步分解,并对其进行处理。

每个递归调用都具有较小的非负值,即“ last-first”。 因此,如果第一个呼叫的“ last-first”值为非负值,则每个呼叫(包括第一个)都将终止。

如果last == first,那么它将返回范围中的唯一元素,即最大值。

否则,它将返回上半部分的最大值(a)和下半部分的最大值(b)中的较大者。

不论哪种情况,最大值都可以正确计算,没有其他情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM