试图了解一个递归函数来反转一个字符串

时间:2019-06-01 09:35:48

标签: c recursion

我不明白为什么此代码有效。字符串中的字符是否由于引用传递而被删除?我没有看到减量之类的东西,所以我感到非常困惑。另外,由于函数调用栈的lifo性质,字符串是否会反转?

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

4 个答案:

答案 0 :(得分:2)

没有被删除。但是传递给函数的指针在以下表达式中发生了变化:

&sPtr[1]

...等同于

sPtr + 1

因此,每个递归调用将指针加1,从而导致递归调用遍历char数组。

至于为什么这会导致字符串反转,堆栈的LIFO性质确实是原因。您的函数 first 递归调用自己,然后 then 使用putchar输出当前字符。因此,这具有以相反顺序输出字符的效果。

答案 1 :(得分:2)

如果输入“ abc”,则调用堆栈将如下所示。

reverse("abc")
    reverse("bc")
        reverse("c")
        print("c")
    print("b")
print("a")

因此,每个反向调用都使用相同的字符串调用自己,但排除了第一个字符,然后在该字符串中打印第一个字符。

  

字符串中的字符是否由于引用传递而被删除?

C中没有通过引用进行的调用。指针有点模仿它,但是C中的所有内容都是按值传递的。此外,指针const char * const的类型说明了两点。首先,不会重新分配指针指向其他任何地方,但是更重要的是,它还表示不会更改字符串。尝试将sPtr[0] = 'a'行添加到某处,您会收到编译器错误。

答案 2 :(得分:1)

不,它不会被删除。

在每个递归调用中,您都希望前进到下一个字符,此操作在此处完成:

reverse(&sPtr[1]); // you pass a parameter the 1st character of where you point to now

答案 3 :(得分:1)

最后一个reverse(&sPtr[1])之后将堆叠3次putchar调用。

reverse的每次调用都将指针加1,因此,堆叠的调用将为-假设输入字符串由3个字符组成-

CURRENT FRAME -- *(ptr+3) is NULL
putchar(*(ptr+2))
putchar(*(ptr+1))
putchar(*(ptr+0))