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語言 用遞迴方法實現...