今天來分析一道非常經(jīng)典的遞歸題目:實(shí)現(xiàn)依次打印出數(shù)字中的每一位。
代碼如下:
void Print(int n){if (n > 9)Print(n / 10);printf("%d ", n % 10);}int main(){int num = 0;scanf("%d", &num);Print(num);return 0;}
結(jié)果如下:

運(yùn)行順序
談到遞歸的時候,最重要的就是要弄明白它究竟是怎么運(yùn)行的
下面的方法非常直觀的表示了它的運(yùn)算順序
這里我用粘貼代碼塊的方式來展示
剛開始執(zhí)行的是scanf輸入,這里不再贅述
void Print(int n){if (n > 9)Print(n / 10);printf("%d ", n % 10);}
這一塊是我們遞歸的主體
void Print(int n){if (n > 9)Print(3578 / 10);if (n > 9)Print(357 / 10);printf("%d ", 357 % 10);//7if (n > 9)Print(35 / 10);printf("%d ", 35 % 10);//5if (n > 9)//這時候值為3,已經(jīng)不滿足條件Print(3 / 10);//該語句不執(zhí)行printf("%d ", 3 % 10);//3printf("%d ", 3578 % 10);//8}
看起來可能有點(diǎn)亂,在這基礎(chǔ)上加上一些箭頭就會清晰了

起初我的想法是,在進(jìn)行if判斷之后,會先執(zhí)行下面的printf,即先打印最后一位數(shù)8,再向前打印
實(shí)際上,if語句后的Print函數(shù)的嵌套調(diào)用是在下一行printf之前的、
也就是說它需要像圖中這樣完全調(diào)用完,直到if判斷為假后,才會從后往前運(yùn)行printf語句
這才有了最開始我貼的結(jié)果
程序依次打印了每一位的數(shù)字

如果這篇博客對你有幫助,還請點(diǎn)贊收藏支持一下!萬分感謝!
-
代碼
+關(guān)注
關(guān)注
30文章
4927瀏覽量
72504 -
遞歸
+關(guān)注
關(guān)注
0文章
29瀏覽量
9258
原文標(biāo)題:C語言習(xí)題:遞歸實(shí)現(xiàn)依次打印出數(shù)字,你學(xué)會了嗎?
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
請問在串口調(diào)試實(shí)驗(yàn)中為什么不停的往串口調(diào)試助手里打印出數(shù)字?
我用printf數(shù)據(jù)傳輸?shù)酱诘臄?shù)據(jù)每一位數(shù)上都加了30 例如數(shù)字是01 則串口助手上是31 請問我用LABVIEW程序怎么讀出01呢?
如何實(shí)現(xiàn)10位數(shù)字軟件激活碼 截取所有中的1%作為有效激活碼
每一位C/C++程序員的調(diào)試工具 : GDB (GUN Debugger) 相關(guān)資料下載
如何利用C語言的位域操作去實(shí)現(xiàn)對寄存器每一位的控制
數(shù)字匹配濾波器的遞歸折疊實(shí)現(xiàn)

遞歸實(shí)現(xiàn)依次打印出數(shù)字中的每一位
評論