我有下面的代码来递归地反转字符串,当递归完成后我打印字符时,它可以工作,但是我不知道如何将反向字符组合成字符串并将其反向返回给调用者。有人有主意吗?我不想添加其他参数来累积字符,只是这样,这不是功课,我正在小事情上做准备,因为我将在一年内毕业,并且需要在面试中做得很好。
char* reversestring5(char* s)
{
int i = 0;
//Not at null terminator
if(*s!=0)
{
//advance the pointer
reversestring5(s+1);
printf("%c\n",*s);
}
}
最佳答案
借助递归函数,通常通常最简单的方法是首先弄清楚如何解决平凡的情况(例如,仅用一对字符反转字符串),然后查看如何将问题分解为简单的操作,最终达到平凡的情况。例如,一个人可以这样做:
这是实际的递归函数:
char *revrecurse(char *front, char *back)
{
if (front < back) {
char temp = *front;
*front = *back;
*back = temp;
revrecurse(front+1, back-1);
}
return front;
}
这部分仅使用递归函数:
char *reverse(char *str)
{
return revrecurse(str, &str[strlen(str)-1]);
}
请注意,这假设指针是有效的,并且它指向以
NUL
结尾的字符串。如果要实际反转字符,则可以提供一对指针并递归交换字母(这是此例程的工作),或者一次将一个字符复制到另一个空间。本质上,这就是您的原始代码正在执行的操作;一次将每个字符复制到
stdout
,这是一个未显式传递但正在由例程使用的全局结构。该方法的模拟,但是使用指针可能看起来像这样:#define MAXSTRINGLEN 200
char revbuf[MAXSTRINGLEN];
char *refptr = revbuf;
char *revstring(char *s)
{
if (*s != 0)
{
revstring(s+1);
*refptr++ = *s; /* copy non-NUL characters */
} else {
*refptr++ = '\0'; /* copy NUL character */
}
return revbuf;
}
在对原始代码的微小修改中,您现在可以看到这种方法对隐藏在原始代码
revbuf
内的全局变量refptr
和stdout
的依赖。显然,这甚至还没有接近优化-仅用于说明目的。关于c - 用C递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25106783/