2017-02-16 37 views
2
#include<stdio.h> 
void func(int x) 
{ 
    if (x==0) 
     return; 
    else 
    { 
     func(--x); 
     printf("%d\t",x); 
    } 
} 
void main() 
{ 
    int k=2; 
    func(k); 
} 

輸出:0 1如何遞歸在這裏工作(下面的代碼)

爲什麼不是輸出0 1 2

第一次調用函數時,x的值等於2. 然後它也應該打印在最後。我對這段代碼感到困惑。 有人可以幫我嗎?

+3

這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+1

行'if(x == 0 )返回;'不可能更清楚。如果'x'是'0',那麼不要執行此功能的其餘部分。 –

+0

作爲下一個練習 - 交換'printf'和'func'行。然後去閱讀關於* head遞歸*和* tail遞歸*。 –

回答

1

對於初學者來說,將參數聲明爲unsigned int會更準確。否則,用負值減小參數可能會導致輸出序列很長。

在函數的每個遞歸調用中,參數首先減少,減小後打印輸出。

func(--x); 
    ^^^^ 
printf("%d\t",x); 

所以,如果因爲參數降低的功能最初被稱爲使用參數等於2然後將其輸出值1

因此

func(2) --> outputs 1 
func(1) --> outputs 0 
func(0) --> outputs nothing 

只有最內層的函數調用,首先輸出其值。

如果你想一下,產量將看起來像

0 1 2 

則因爲它是在這個示範項目顯示的功能應該被定義

#include <stdio.h> 

void func(unsigned int x) 
{ 
    if (x) func(x - 1); 
    printf("%u\t", x); 
} 

int main(void) 
{ 
    func(2); 
    putchar('\n'); 
} 

功能輸出

0 1 2 

函數不同於原始函數的是參數本身不是de在函數調用中摺痕。它保持其價值不變。

if (x) func(x - 1); 
       ^^^^^^ the variable x itself is not changed 

如果發生在方法開始時的遞歸調用,它被稱爲遞歸頭。該方法在跳入下一個遞歸調用之前保存狀態。

0

你只需在printf之後交換遞歸調用。

#include<stdio.h> 
void func(int x){ 
if(x==0){printf("%d\t",x); 
return;} 
else{ 
    func(--x); 
    printf("%d\t",x+1); 
    } 
    } 
int main(){ 
    int k=2; 
    func(k); 
} 
+2

它是如何回答這個問題的? –

+0

請詳細解釋。 – Thecave3

+0

如果您先printf,然後調用您將有正確的輸出 – Thecave3

1

--x減小x的值,然後在打印前這樣做;這就是爲什麼輸出是0 1而不是0 1 2

0

這裏,x的第一個值減少並且每次都壓入堆棧直到x == 0,然後,最終結果按照初始遞歸函數調用的精確逆序進行累加。