c語言遞迴練習題,用debug自己搞了一遍還是搞不懂為什麼會倒著輸出一遍,求大神給講講

2021-03-20 22:37:08 字數 6046 閱讀 1065

1樓:匿名使用者

這個邏輯上很簡單啊,讀取一個字元,如果不是eof,就繼續遞迴,直到讀出eof,然後顯示字元,結束。

所以你的程式裡,if及下面的遞迴呼叫改一下就好。自己試試吧!

int recursive()

2樓:gta小雞

把每次呼叫recursive()的地方都用recursive的整個函式體替換一遍,就像俄羅斯套娃一樣,再來看這個程式,就懂了。

3樓:wolove書

因為是遞迴,相當於後進先出的棧。停止輸入後開始輸出,倒著來一遍 逆序了

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

4樓:孟羽然

其實遞迴呼叫就是一個「壓棧」/「彈棧」的過程。

每一次遞迴呼叫,就會把當前的現場壓棧,然後呼叫下一層;呼叫完畢後,從棧中恢復現場,繼續執行。

拿你這個遞迴函式來看,在入口和出口處分別列印了一條日誌。

入口處的日誌,一進入函式即被執行,然後進行遞迴呼叫,遞迴返回後,再列印出口的日誌。

這樣總體呼叫效果就像這樣:

1 # 第1層遞迴入口| 2 # 第2層遞迴入口| | 3 # 第3層遞迴入口| | | 4 # 第4層遞迴入口| | | 4 # 第4層遞迴出口,返回上層| | 3 # 第3層遞迴出口,返回上層| 2 # 第2層遞迴出口,返回上層1 # 第1層遞迴出口,返回上層

5樓:匿名使用者

void up_and_down(int n)那麼一步步剖析,n與指令流:

n 指令流

1 輸出,進入子過程

2 輸出,進入子過程

3 輸出,進入子過程

4 輸出,輸出

3 從子過程返回,輸出

2 從子過程返回,輸出

1 從子過程返回,輸出

注意每一個遞迴中有一前一後兩個printf哦

6樓:孫永超

**一下就知道原因了

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

7樓:匿名使用者

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

8樓:匿名使用者

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

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

【c語言】函式遞迴問題,題目見**,答案為什麼是d?求解!為什麼是倒著輸出的?!

9樓:蜻蜓點水

遞迴函式式自己呼叫自己,那麼那個函式會一直執行到某個特定滿足的條件的時候,才會從裡面忘外面返回啊

比如就是f(f(f(3)));

進去之後,是從最裡層的函式返回吧,那麼就是倒著瞭如果用再具體一點,就是堆疊的先進後出了,上一級的函式的東西都在底下,只有最後一層的在棧頂

10樓:帶著光圈的小雞

由於子函式呼叫在printf()語句之前,所以得到符合條件(x/2>0)為假時,才能跳過fun()呼叫,

執行printf()語句;而啥時候符合呢,請看程式執行:

第一次呼叫fun()時x=20,x/2=10>0,所以繼續呼叫fun(8);

x=8,x/2=4>0,所以繼續呼叫fun(2);

x=2,x/2=1>0,繼續呼叫fun(-1);

x=-1,x/2<0;此時if語句條件為假,執行printf() 輸出-1,

然後返回上級,仍然執行printf(),而此時x=2,輸出2然後返回上級,仍然執行printf(),而此時x=8,輸出8然後返回上級,仍然執行printf(),而此時x=20,輸出20

11樓:香山雪葉

fun(20)

printf("%d ",2);

}printf("%d ",8);

}printf("%d ",20);

}遞迴解釋起來還挺麻煩的,我把遞迴了,就如上,函式從上往下執行,就分別輸出 -1 2 8 20了

再加上花括號

12樓:匿名使用者

這就是遞迴啊。在fun(20)裡面呼叫fun(18), fun(18)不執行完,fun(20)中的printf不會執行,fun(18)裡面呼叫fun(7), fun(7)不執行完,fun(18)中的printf不會執行。以此類推。

就可以理解了

13樓:匿名使用者

這個是遞迴啊 碰到函式了 當然函式先執行 所以 輸入20->fun(8)

->fun(2)

->fun(-1) -1不滿足判斷條件

->執行 printf -1

->返回到上層 printf 2

依這種思路執行 所以倒序輸出哦

c語言問題 遞迴函式求倒序輸出 急求 **等!!總是報錯

14樓:我愛上那女孩

你的錯誤不僅是沒有終止條件,既然用遞迴,你的for迴圈又用於何處?遞迴就是取代了for的作用,你單獨用for迴圈可以實現,單獨用遞迴也是可以實現,你這二者結合的,便出現邏輯上的錯誤。

另外你的return (s+hanshu(int(n/10)));在新的一輪遞迴中,s=0;總而言之,你的遞迴程式很亂,讀不懂。

下面是我結合你的思路實現的遞迴演算法:

#include "stdio.h"

#include "conio.h"

#include "math.h"

int hanshu(int n,int*sa)else

}int main()結果:

15樓:匿名使用者

沒有遞迴終止條件,

int x,y,s;

if(n<10)

x=n%10;

....

c語言遞迴函式題,大神給我解釋一下。

16樓:匿名使用者

階乘函式

=f(10)

=10 * f(9)

=10 * 9 * f(8)

.........

=10 * 9 * 8 * 7 * ..... f(1)=10 * 9 * 8 * 7 * ..... 1 * f(0) //0 < 1不符合if return1 結束

c語言遞迴求逆序,求大神解釋。 求解釋下這樣遞迴的思想,不明白為何

17樓:匿名使用者

由於題目中限定了遞迴

又禁止使用了那麼多的輸入輸出函式

那麼能用的 只有getchar 和putchar了要逆序輸入

比如有3個字元。

那麼輸入輸出的順序就應該是

getchar

getchar

getchar

putchar

putchar

putchar

也就是 最後一個get到的,要最先輸出。

這樣遞迴函式就寫成

先getchar

遞迴呼叫函式

再putchar

這樣形式了。

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

18樓:瀟瀟小百

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也是這樣的

19樓:匿名使用者

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

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<

C語言若干題,c語言練習題

main 結果 2,3,1 main i for i 0 i 3 i scanf d x i printf 3d 3d 3d n x 0 0 x 0 1 x 1 0 輸入 2 4 6 結果 2 0 4 x32就是3行2列 x00 01 10 11 20 21 x0 x1 x2 分別對應 x00 x1...

c語言5道練習題求大神程式設計QWQ除錯可執行

include typedef struct stustu int main for i 0 i 3 i printf n最高分學生的資訊 n printf 學號 s n stus max num printf 姓名 s n stus max name printf 第1門課成績 2f n stus...

1100用c語言的遞迴法求和,C語言應用遞迴呼叫的方法分別求123100或N

1 首先本題的思路已經給出,要求用遞迴演算法。2 程式源 如下 include int sum int n int main 下面是一個遞迴求和函式 int sum int n 3 程式的輸出結果如下 include int sum int n int main void a c語言 用遞迴方法實現...