#include <stdio.h>
void fun(int a) {
if (a > 0) {
fun(a / 10);
printf("%d", a % 10);
fun(a / 10);
}
}
int main() {
fun(12345);
return 0;
}
在這里,由于函式在塊的開頭呼叫自己if,它不應該什么都不列印嗎,它會一直呼叫自己,直到函式引數變為零?
但相反,輸出是1213121412131215121312141213121
uj5u.com熱心網友回復:
它不應該什么都不列印嗎,它會一直呼叫自己,直到函式引數變為零?
如果我理解正確,那么您是對的。在 a 等于 0 之前,該函式不會輸出任何內容。
void fun(int a){
if(a > 0){
fun(a/10); // calls itself.
printf("%d",a % 10);
//...
因此,對于這個數字12345,第一個輸出將是最高有效數字 1。
由于函式兩次呼叫自身
void fun(int a){
if(a > 0){
fun(a/10);
printf("%d",a % 10);
fun(a/10);
}
}
然后對于除最高有效位之外的數字的每個數字,前一個和下一個數字將在左側和右側輸出兩次。例如
1 2 1
1 2 1 3 1 2 1
1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
and so on.
我使用嵌入式空格使輸出更清晰。
uj5u.com熱心網友回復:
在遞回的最內層函式完成(a>0)評估為 false 后,它將執行 print 陳述句并回傳到呼叫函式。呼叫者將列印它的a值等等。
不知道為什么你呼叫 fun(a/10) 兩次,但這就是輸出被列印兩次的原因。
uj5u.com熱心網友回復:
你不需要第二個電話
void fun(int a)
{
if(a)
{
fun(a/10);
printf("%d", a % 10);
}
}
https://godbolt.org/z/zWf64jjWe
請記住,它不適用于負數。
uj5u.com熱心網友回復:
該函式嘗試列印 的十進制轉換,a但第二次遞回呼叫會產生額外的輸出。
對于低于 的值,該函式確實不會產生任何輸出10,這可能不是預期的行為。如果沒有第二次遞回呼叫,輸出將是1234.
你應該改用這個:
void fun(int a) {
if (a >= 10)
fun(a / 10);
printf("%d", a % 10);
}
但是請注意,上述函式僅適用于正值。
uj5u.com熱心網友回復:
您可以通過 3 種不同的方式實作此功能:
- 在開始列印之前進行遞回呼叫。如果是這樣,列印從最深層次的遞回開始。這是非常低效的,但可以確保您獲得預期的順序 1,2,3... 通常,在最后沒有遞回呼叫的遞回函式是任何問題的錯誤解決方案。
- 或者在列印后進行遞回呼叫。當您當前撰寫函式時,這將導致所有內容都向后列印。然而,一個以呼叫結尾的遞回函式,即所謂的“尾呼叫”,有時可以優化為幾乎與回圈一樣有效的代碼。如果您想出不同的演算法,您也可以在這里執行此操作。
- 或者您可以將其實作為回圈。超快,超易讀,沒有過度堆疊的風險,沒有開銷。這是 99% 的所有情況下的正確解決方案,也是初學者可能面臨的 100% 的所有情況下的正確解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493575.html
上一篇:試圖解決Leetcode78PrintSubsets問題。為什么我得到這樣的輸出串列[[].[],[],[],[],[],[],[]]?
