如圖藍色選擇條部分,為什麼遞迴完成之後還要把每一次遞迴後面的輸出語句執行一遍呢

2021-04-02 12:49:14 字數 3412 閱讀 9252

1樓:匿名使用者

你會整體思維嗎?

printarray(10)是由兩部分組成的,printarray(9)和sysem.out.println(value[9])

你說是執行完了printarray(9)再執行sysem.out.println(value[9])呢?還是反過來呢?

答案不是很明顯了嗎?

2樓:匿名使用者

你把sysem.out.println這句放到if(i==0)前面就行了。

c語言遞迴的問題,遞迴結束之後為什麼還要倒過來一遍?

3樓:匿名使用者

void函式是可以不寫return語句的,沒有return也是return。

4樓:匿名使用者

函式是否要return 乙個值,是看邏輯需求的需要的

現在這個函式定義沒有返回,而是直接列印出來~

c語言的遞迴問題 為什麼會倒過來執行一次

5樓:瀟瀟小百

void up_and_down(int n)主要在這裡,當n=1的時候程式執行到

if(n<4)

up_and_down(n+1);

的時候,就會由於遞迴的原因回到void up_and_down函式開啟頭去執行n = n+1的情況了,也就是說,當n=1時,剛開始是不執行if後面那個的要等重重遞迴使得n=4的時候才執行n=4時的if後面那個printf語句的,然後再返回上一層遞迴,也就是n=3的時候,再執行n=3的時候的printf,n=2,n=1也是這樣的

6樓:匿名使用者

首先先跟你說下,你是不是忘了你的遞迴函式,首尾都要輸出。注意程式縮排,養成好習慣。

void up_and_down(int n)

以你的例子而言,首先是過程(此時n<4),在呼叫遞迴函式前先要執行第一行的輸出語句,然後呼叫遞迴語句up_and_down(1+1);進入下一層函式,依次類推,你看到了1、2、3、4。當n=4時階段結束,不再呼叫遞迴函式,但仍要依照順序執行此函式全部語句,所以要輸出4,函式執行完畢後,要返回函式呼叫處(up_and_down(3+1);的下一句),繼續按順序執行輸出語句 輸出3,同理再依次輸出2、1

所以最後看到的是1 2 3 4 4 3 2 1

up_and_down(1);

printf("1");

up_and_down(1+1);

printf("2");

up_and_down(2+1);

printf("3");

up_and_down(3+1);

printf("4");

printf("4");

printf("3");

printf("2");

printf("1");

遞迴解決問題本來就是先,直到遇到終止條件,然後再逐層返回,並不是算到最後一層,就直接返回給第一層呼叫處。以階乘為例:

rescuvie(5)}}}

}}}}}}}}}

120由於遞迴的這種特性,所以要佔據很大的空間,如果一直沒有遇到遞迴終止條件,則會一直進行下去,直到資源耗盡。階乘數大於某一程度,計算機就無法解決了。

因此與迭代相比遞迴是十分低效的演算法,不過由於遞迴有抽象的表達能力,只要有遞推關係,不必求出具體表示式就可以求解問題,所以應用還是比較廣泛的。

以上方法都被稱為線性遞迴,也可以說是傳統的遞迴。而你後面說的尾遞迴,是另一種新的方法,與傳統的線性遞迴相比,可節省資源所佔資源,避免資源耗盡的問題。

下面舉階乘尾遞迴的例子

long tailrescuvie(long n, long a)

long tailrescuvie(long n)

tailrescuvie(5)

tailrescuvie(5, 1)

tailrescuvie(4, 5)

tailrescuvie(3, 20)

tailrescuvie(2, 60)

tailrescuvie(1, 120)

1-2返回120

2-3返回120

3-4返回120

4-5返回120

tailrescuvie(5,1)返回120給tailrescuvie(5)

返回並輸出120

很容易看出,普通的線性遞迴比尾遞迴更加消耗資源,在實現上說,每次重複的過程呼叫都使得呼叫鏈條不斷加長,系統不得不使用棧進行資料儲存和恢復。而尾遞迴就不存在這樣的問題,因為他的狀態完全由n和a儲存。

就思想而言,尾遞迴其實也是一種線性遞迴,不過它把運算結果(或路徑)傳給了下一層,編譯器可以利用這一特點對語句進行優化,節省所佔資源。而且當遇到終止條件後,雖然形式上仍要返回,但計算已經結束,只要將值不斷返回即可,不必再運算,因此每次分配的記憶體不會因為遞迴而擴大。

尾遞迴適用於運算對當前遞迴路徑有依賴的問題,傳統遞迴適用於運算對更深層遞迴有依賴的問題。從效率來看兩者都差不多,不過編譯器對尾遞迴可以進行優化,大大減小尾遞迴所佔資源,而普通遞迴,編譯器的優化沒太大影響。(如果都不優化,其實所佔資源差不多)

如果你改寫下long tailrescuvie(long n, long a);使得它在頭尾輸出n(遞迴呼叫前後都輸出),你會發現輸出結果仍然是,n、n-1 ……2 1 1 2……n-1、n的過程。

不存在你說的到一半就結束了。

long tailrescuvie(long n, long a) {

cout<

7樓:匿名使用者

c語言;自頂向下,依次執行

執行完print語句後,需要返回到fun後面(因為if條件已經不滿足),所以不能再呼叫fun,而是執行相應的print語句

8樓:龍__鳳

這是因為沒執行乙個up_and_down()函式都會有兩個輸出,對於你的程式,總過輸出8次,自然是先輸出1,2,3,4,然後又輸出4,3,2,1了

9樓:匿名使用者

up_and_down(n+1);這句執行完,就直接進入了遞迴, 這句還沒有執行,所以最後一層執行完之後會一次返回到上一層,因此倒著輸出了4 3 2 1

10樓:小白丶風

當然是輸出8行啦,你up_and_down方法裡邊有兩個printf,遞迴的時候,都是執行了第一句,然後判斷,遞迴呼叫,只到n=4的時候,輸出了第乙個4,if判斷不在遞迴,執行了第二個print,輸出了第二個4,然後完成了這層遞迴呼叫,返回前一層n=3的遞迴,輸出第二個3完成了這層呼叫再返回前一層。。。只到輸出第二個1,遞迴才結束,只要刪掉方法裡第二個printf輸出的就是4行了

劃線部分,為什麼要加減l啊

如圖所示 bai 意思就是,由 du於這對偏導數成立zhi的條件dao是在內c內必須連續。但對於奇點 0,0 處就不成立了,不能直接運用容green公式。所以在c內挖乙個足夠小的能包圍奇點 0,0 的圓c1,使得 0,0 不在c的範圍內,於是green公式就可以用了。但這個圓c1不能憑空加上去的,最...

工程製圖求解畫圈部分為什麼不標註

因為該機件的這個部位原本是乙個圓柱體,但是被從上到下挖了乙個槽,這個槽的寬度在俯檢視有標註是17,因此,主檢視中你用藍色圈住的部位相當於是被挖了乙個17寬的槽以後,剩下的結構尺寸,因此不能標。可以根據已有的推理出來 工程製圖求解這個地方為啥不畫虛線,首先你要弄清楚機件的結構特徵,這是個組合體,你記住...

美國國土為什麼分兩部分,為什麼美國的領土會分為兩塊啊

美國本土應該不止兩部分!還有夏威夷,應該是三部分50個州 幾乎都是買的,大部分從法國拿破那小傻子那買的 為什麼美國的領土會分為兩塊啊 美國以平均每英畝2美分的 買下最大飛地,占地有5個德國的大小,不光蘊藏豐富的礦產資源,還成為重要的 戰略部署地點 如果那時候沙俄不賣給美國,即使英國暫時的搶走了,後面...