2014-04-03 111 views
1

我在嘗試遞歸,並嘗試使用此練習打印單詞backwords。我究竟做錯了什麼?C向後遞歸打印

#include <stdio.h> 
#include <stdlib.h> 


void recursivePrint(char* x){ 

    if (*x = '\0') 
     return; 
    else 
     recursivePrint(x++); 
     printf("%c", *x); 

} 

int main() 
{ 
    char x[10] = "Hello"; 

    recursivePrint(x); 
    return 0; 
} 
+2

1)'if(* x ='\ 0')'2)'x ++', – BLUEPIXY

回答

6

=是一個賦值操作符。 ==用於比較。 變化

if (*x = '\0') 

if (*x == '\0') 

編輯:

看到的第一個字符,

變化

void recursivePrint(char* x){ 
    if (*x == '\0') 
     return; 
    else 
     recursivePrint(x++); 
    printf("%c", *x); 
} 

void recursivePrint(char* x){ 
    if (*x == '\0') 
     return; 
    else 
     recursivePrint(x+1); 
    printf("%c", *x); 
} 
+0

謝謝!愚蠢的錯誤,我該如何改變邏輯來顯示第一個字符H?因爲我正在增加x。 – runners3431

+0

@ runners3431:第一個結果是否意味着? –

+0

我得到這個輸出「olle」而不是「olleH」 – runners3431

1

從本來是一個比較(如在另一個答案指出)的分配,你不應該增加x,因爲你會想試試這個

void recursivePrint(char* x){ 
    if (*x == '\0') 
     return; 
    recursivePrint(x+1); 
    printf("%c", *x); 

} 
3

除了在遞歸調用之後輸出它。增量x是不必要的,正如您所看到的那樣容易出錯。所發生的事情是電話號碼i是打印字符i+1,所以倒數第二次呼叫實際上是將空終止符傳遞到printf();第三到最後就是通過人物的NULL前,等看到它是這樣的:

recursivePrint("Hello"); 
    recursivePrint("ello"); 
     recursivePrint("llo"); 
      recursivePrint("lo"); 
       recursivePrint("o"); 
        recursivePrint(""); 
         return; 
        /* x was incremented, points to \0 */ 
        print '\0' 
       /* x was incremented, points to "o" */ 
      /* ... */ 

所以基本上,你總是提前要打印一個一個字符。您可以通過將x[-1]傳遞給printf()來修復它,但這很醜陋。更好的方法是:

void recursivePrint(char *x) { 
    if (*x == '\0') 
     return; 

    recursivePrint(x+1); 
    printf("%c", *x); 

} 

這是更好,因爲你永遠不希望/在首位遞增x需要。

+0

謝謝Filipe!現在完美。 – runners3431

1

你很近,但這裏的一些答案是不正確的,並生成段錯誤。

#include <stdio.h> 
#include <stdlib.h> 

void recursivePrint(const char *x) { 
    if (*x == '\0') { 
     return; 
    } 
    recursivePrint(x+1); 
    printf("%c", *x); 
} 

int main(void) { 
    const char* x = "Hello"; 
    recursivePrint(x); 
    return 0; 
} 

你應該真的使用const char*,因爲你的函數不會修改數據。

+0

謝謝你的const。 – runners3431