#include void fun(int n)
int main()
輸出結果為:
分析1) 主函式呼叫fun(1);
2) 此時n的值為1,隨即輸出第一行,並得到n的位址並將其抽象為aaaa;
3) 判斷,1 < 3,執行遞迴語句, 重新執行fun函式;
4) 由於傳遞引數為n+1,所以本層n的值為2,隨即輸出第二行,並得到n的新位址將其抽象為bbbb;
5) 判斷,2 < 3,執行遞迴語句, 重新執行fun函式;
6) 同理可得本層n的值為3,得到第三行結果,並將n的新位址抽象為cccc;
7) 判斷,3 < 3不成立,不執行遞迴, 直接執行第二條輸出語句,即輸出第四行結果,此時顯示n的位址為cccc,容易理解;
8) 本層結束,返回上一層斷點處繼續執行,即n為2的那一層,當時程式去已經執行遞迴,所以接下來執行第二次輸出,即得到第五行輸出結果,此時n的位址顯示為bbbb;
9) n為2時的一層執行結束,返回上一層,即n為1,當時程式去已經執行遞迴,所以接下來執行輸出語句,即得到第六行輸出結果,此時n的位址顯示為aaaa;
程式結束。
總結:1. 每一級的遞迴都使用它自己的私有的變數n,可以檢視位址的值來證明。
2. 每一次函式呼叫都會有一次返回.當程式流執行到某一級遞迴的結尾處時,它會轉移到前一級遞迴繼續執行。
3. 位於遞迴呼叫語句前的語句的執行順序和各個被呼叫函式的順序相同,位於遞迴呼叫語句後的語句的執行順序和各個被呼叫函式的順序相反。
4. 遞迴函式中必須包含可以終止遞迴呼叫的語句來避免死迴圈。
輸出結果為:
分析1) 主函式呼叫fun(1);
2) 此時n的值為1,隨即輸出第一行,並得到n的位址並將其抽象為aaaa;
3) 判斷,1 < 3,執行遞迴語句, 重新執行fun函式;
4) 由於傳遞引數為n+1,所以本層n的值為2,隨即輸出第二行,並得到n的新位址將其抽象為bbbb;
5) 判斷,2 < 3,執行遞迴語句, 重新執行fun函式;
6) 同理可得本層n的值為3,得到第三行結果,並將n的新位址抽象為cccc;
7) 判斷,3 < 3不成立,不執行遞迴, 直接執行第二條輸出語句,即輸出第四行結果,此時顯示n的位址為cccc,容易理解;
8) 本層結束,返回上一層斷點處繼續執行,即n為2的那一層,當時程式去已經執行遞迴,所以接下來執行第二次輸出,即得到第五行輸出結果,此時n的位址顯示為bbbb;
9) n為2時的一層執行結束,返回上一層,即n為1,當時程式去已經執行遞迴,所以接下來執行輸出語句,即得到第六行輸出結果,此時n的位址顯示為aaaa;
程式結束。
總結:1. 每一級的遞迴都使用它自己的私有的變數n,可以檢視位址的值來證明。
2. 每一次函式呼叫都會有一次返回.當程式流執行到某一級遞迴的結尾處時,它會轉移到前一級遞迴繼續執行。
3. 位於遞迴呼叫語句前的語句的執行順序和各個被呼叫函式的順序相同,位於遞迴呼叫語句後的語句的執行順序和各個被呼叫函式的順序相反。
4. 遞迴函式中必須包含可以終止遞迴呼叫的語句來避免死迴圈。
遞迴式描述分治演算法執行時間的簡單描述
分解 將原問題分解成若干個規模更小的子問題 解決 當子問題小到一定程度時,通常是當子問題可以在常量時間內得到解決,此時成為遞迴觸底,那麼此時子問題可以很快得到解決 合併 解決子問題之後,最重要的乙個操作就是將多個子問題合併成原問題的解 通過上述的簡單思想,可以認為,乙個大問題可以通過分解成多個更小的...
遞迴的執行過程
1 if root null 4 int left maxdeepth root.left 5 int right maxdeepth root.right 6 return left right?left 1 right 1 這是求樹的深度。那麼程式執行到第四行時,會不會先將left的遞迴呼叫壓入...
shuffle過程的簡單描述
shuffle是處在map和reduce之間的過程。我們看一下這個過程都有哪些步驟,對這個問題了解的並不深,可能有錯誤,忘指正 1.map map輸出key,value,對應 裡的context.write key,value 這個步驟是將key,value寫到記憶體buffer裡了,這個記憶體的預...