2017-09-06 97 views
0

不久,我需要知道这个功能是如何工作的?里面有什么?传递的字符串如何反转?这个递归线如何实现打印字符串反转?

这里是代码,并提前致谢。

#include <stdio.h> 
void rev (const char* const); 

int main() 
{ 
    char str [] = "Hey There"; 
    rev(str); 

    return 0; 
} 

void rev(const char* const c) 
{ 
    if(c[0]=='\0') 
     return ; 
    else 
    { 
     rev(&c[1]); 
     putchar(c[0]); 
    } 
} 

编辑:作为评议人建议,我会解释我不理解了。字符串不颠倒,但反向打印,好吧。用来做这件事的机制是什么?什么是执行顺序?

+0

我不认为你会收到很多答案,如果你没有努力解释更多,尤其是你不明白什么..... –

+3

字符串是不反转,它只是*印* *在相反。巨大差距。 – unwind

+0

字符串没有反转。它被**打印**反向。 – wildplasser

回答

1

的原因是,该代码指示它处理输出当前炭前做的字符串的其余部分。想象一下字符串“on \ 0”

rev("on\0"); 
    ->rev("n\0"); 
    ->rev("\0"); 
     <-return; // hits base case 
    putchar('n'); // resumes after recursive call 
    <-return;  // invisible return at end of function 
    putchar('o'); // resumes after recursive call 
    <-return;  // invisible return at end of function 

这里的每个标识代表一个嵌套的调用。因此,在基本情况下,您可以同时拨打rev的3个电话,每个号码都有不同的c

其重要的是知道c独特每次调用这样,当以rev返回调用先前revc具有不在被叫改变。这使得它没有什么特别的,所以实际上它的工作方式与每次调用不同函数的方法相同。它在上次呼叫返回后继续。

+0

现在更清楚了,但唯一不能理解的是如何通过字符串来检测肿瘤?什么行将指针移动到下一个字符? – Kordy

+0

这是C指针魔术..'&c [1]'这得到'c'的第二个元素的地址。因此,对于\ n“'中的* char”,其中'c'是内存地址0,'&c [1]'将指向内存地址1,代表'“n \ n”'。如果数组是整数'&intArr [1]'是'&intArr + 8'(对于64位整数) – Sylwester

-1

如上所述,它是递归函数。所以执行如下

从main(),rec()被调用。控件现在进入rec()函数。在哪里进行条件检查以检测字符串的结尾。直到检测到字符串结束,否则部分被执行。

现在让我们看看其他部分发生了什么。

else再次调用rec()。再次调用rec(),直到满足字符串的结尾。

因此调用顺序就喜欢这个 - >

main()-> rec()->rec(rec(rec(... until \0..) putchar()) putchar())putchar()) 

所以从去年putchar()最后rec()功能控制的结束将被执行。然后在最后一个之前继续,直到从main()调用的第一个rec()

main() - >rec(H),因为它不为空 - >再次呼吁rec(e)

这里的控制还没有出来第一个电话到rec()。所以rec(H)看起来

rec(H) 
{ 
rec(e); 
putchar(H); 
} 

它继续这样下去

0

其实这个递归函数并不颠倒输入字符串。它只是以相反的顺序打印。 的逻辑是简单 - 假设我有字符串str [4] = “ABC” 这是空终止字符串中C.

  • 对于第一呼叫到修订版(STR) - STR [0]是“ A'非空 - >调用rev(str [1])和print str [0] ='A'
  • 第二次调用rev() str [0]是'B',它不是null - > call rev(str [1])和print str [0] ='B'
  • 依此类推,直到找到'\ 0'。

现在从每个函数返回之前调用它打印海峡[0] -

  • 所以对于“\ 0” - 它只是返回,不打印任何东西。对于'C',它将打印'C'
  • 对于'B',它将打印'B' 依此类推。

所以字符串将以相反的顺序打印。

0

根据你的程序,**ħeythere **,在转功能,

  1. C [0] = H被检查为NULL,或者不==> NO
  2. 传递地址& c [1] =“ey there”e开始再次转动功能。
  3. C [0] = E被检查为NULL,或者不==> NO
  4. 传递地址& C [1] = “Y有”其开始从ý再次加快转速的功能。
  5. 该逻辑持续到结束。
  6. C [0] = E被检查为NULL,或者不==> NO
  7. 传递地址& C [1] = \ 0是NULL字符将被传递到修订版功能。
  8. 一旦识别出\ 0,rev函数开始返回。
  9. rev函数后,我们有putchar(c [0]),其中c [0]的最新值为'e'[按照第6点]。
  10. 打印继续ËřËH TýËħ
0

为了使功能的作用重写它更清晰下列方式

void rev(const char * const s) 
{ 
    if (s[0] != '\0') 
    { 
     char c = s[0]; 
     rev(s + 1); 
     putchar(c); 
    } 
} 

所以对于存储功能的字符串在变量c的第一个字符函数的第一个电话。

然后该函数被称为第二次将指针移动到第二个字符。该函数再次将该字符存储在其自己的(本地)变量c中。

依此类推,直到遇到终止零。

然后,在将控件传递给调用调用之前,每个函数调用都将打印存储在变量c中的字符,并获得字符串字符的相反顺序。