我无法理解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 ];
}
答案 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;
。