簡體   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