2014-04-03 109 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