反向字符串函数C ++

时间:2016-05-14 22:07:10

标签: c++

我无法理解stringReverse函数的工作原理

任何人都可以向我推销吗?

实际上((stringReverse(& strArray [1]);))含糊不清。

#include <iostream>

using namespace std;

void stringReverse( const char [] );

int main()
{
const int SIZE = 30;
char strArray[ SIZE ] = "Print this string backwards.";

for ( int loop = 0; loop < SIZE; ++loop )
cout << strArray[ loop ];

cout << '\n';
stringReverse( strArray );
cout << endl;

return 0;
}

void stringReverse( const char strArray[] )
{
if ( strArray[ 0 ] == '\0' )
return;

stringReverse( &strArray[ 1 ] );
cout << strArray[ 0 ];
}

3 个答案:

答案 0 :(得分:2)

实际上非常简单,如果你在一张纸上写出来,使用短字符串(例如"123")。使用stringReverse参数调用"123"会导致以下调用:

stringReverse("123")
  -> stringReverse("23")
       -> stringReverse("3")
            -> stringReverse("")
               // strArray[0] == 0
               -> return
          cout << '3'
      cout << '2'
cout << '1'

函数递归调用自身,在每次调用时将当前字符指针前进一个字符,直到它到达结尾,然后立即返回。剩下的是递归调用的输出(cout),它还没有运行。

换句话说:每个递归调用都会在堆栈上放置一个字符。一旦到达终点,并且最后的递归调用返回,函数将从中断处继续(在递归调用之后),将字符从堆栈顶部打印到底部。

答案 1 :(得分:0)

是一种简单的递归算法,可以追溯到大量的字符,当它返回时它会打印字符符号

stringReverse( &strArray[ 1 ] )

是下一个重复级别的一个小点,你可以看到strArray [1]作为索引为0的第一个元素(strArray [0]),strArray [2]的下一个递归等等。

&strArray

是数组内存的链接,所以如果你想理解递归算法从“后退”到“开始”的工作

答案 2 :(得分:0)

当您将数组传递给函数时,数组会衰减到指向其第一个元素的指针(除非您通过引用传递它,这不是这里的情况)。在strArray的情况下,这是一个字符数组,这意味着您传递了第一个字母的地址。因此,当main()函数调用stringReverse( strArray );时,它所做的就是将指针传递给'P'的{​​{1}}。但请记住,字符串终结符("Print this string backwards.")会自动添加到每个字符串的末尾,因此在这种情况下,还会有一个字符串终结符#34;不可见&#34;标记数组末尾的字符。

该函数检查它收到的第一个字符是否为'\0',如果不是,则递归调用自身,但这次它不会将完整的字符串作为参数传递;相反,它传递位置1处的字符的地址(记住数组索引从0开始,因此它实际上是第二个字符;在这种情况下,'\0')。这意味着传递的新字符串为'r'。然后是"rint this string backwards.",每次跳过第一个字母时它都会继续。如果只有点"int this string backwards."(和往常一样,结尾处是不可见的'.'),则下一个调用仅传递'\0'字符,'\0'为真并且函数返回而不做任何事情。这就是递归的结束:这次函数不会调用自己。

现在,递归的关键是程序会记住每个函数被调用的状态,这样当函数完成时,它就会从那里恢复。这意味着函数中的下一条指令是if之后的一条指令,即stringReverse( &strArray[ 1 ] );,它打印字符串的第一个字符。 那个字符串,也就是传递 时间的子字符串。在这种情况下,字符串是cout << strArray[ 0 ];(加上字符串终结符),因此第一个字符是点".",并打印出来。函数返回,程序的执行从调用函数恢复:字符串为'.'的函数。在这种情况下,"s."对应strArray[ 0 ],并打印出来。然后函数返回,前一个函数恢复,为此字符串为's',因此打印"ds."。它一路走来。

这样,字符向后打印。这一直持续到结束:在打印'd'之后,函数终止,执行返回'P'

举一个例子:带一些朋友,让他们形成一排。对于他们每个人,你都会给出相同的指示:当你收到一个球时,记住给你的字符串,告诉右边的那个人从第二个字母开始的字符串然后给他起球。如果你被告知的字符串是空的,什么都不做,然后将球送回左边的那个。当有人拿回球时,他必须说出第一个字母(他没有发给其他人的那个)并将球送回左边的那个。所以它会是这样的:

第一个接收字符串&#34;向后打印此字符串。&#34;,他说&#34;向后rint这个字符串。&#34;在他右边的那个并且给他球。 第二次听到&#34;向后拉这个字符串。&#34;,所以他说&#34;把这个字符串倒退。&#34;并将球传给右边的球。它一直持续到最后:最后一个接球,但是球是空的,所以他只是将球送回左边的球。那时,他面前的那个人说'&#39;。&#39;然后将球传给左边的那个球,谁会说'&#39;然后将球留下,依此类推,直到该排的第一个人接到球并且说'P&#39;