(我不会说英语,所以我很抱歉我的错误)
我正在学习C语言,(我正在阅读 The C Programming Language,第二版)。我无法完成练习4-13:
写一个函数reverse(s)的递归版本,其中 将字符串s反转到位。
我必须创建这个函数而不使用我尚未研究的指针或事物 这是我的代码:
void reverse(char s[])
{
int c;
static int i, k;
i = 0;
k = 0;
if ((c = s[i]) != '\0')
{
i++;
reverse(s);
}
if (c != '\0')
s[k++] = c;
}
但它不起作用。你能帮帮我吗?
答案 0 :(得分:4)
您正在重置" i"的值和" j"在函数中为零。 静态变量在声明语句中只初始化一次。 像这样初始化变量:
static int i=0, k=0;
您也可以将静态变量初始化为0,因为它会自动完成。但是在声明期间初始化变量是一种很好的编程习惯。
答案 1 :(得分:0)
但是,请参阅@vikas的答案,它只能反转第二个字符串,i和k必须再次重置。以下是:
static int i, k;
void reverse(char s[]);
int main(void)
{
char s[]="hello world";
i= k= 0;
reverse(s);
return 0;
}
void reverse(char s[])
{
int c;
if ((c = s[i]) != '\0')
{
i++;
reverse(s);
}
if (c != '\0')
s[k++] = c;
}
答案 2 :(得分:0)
在C中使用递归算法是一个坏主意(当然少有例外),因为与等效迭代版本相比,空间成本和性能较差。也就是说,这是我对reverse(s)的递归实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void reverse(char s[],const size_t start,const size_t end);
int main(void)
{
char s[] = "C is a great programming language";
reverse(s,0,strlen(s) - 1);
printf("Reversed string: %s\n",s);
return EXIT_SUCCESS;
}
static void reverse(char s[],const size_t start,const size_t end)
{
if(start < end && NULL != s)
{
char tmp = s[end];
s[end] = s[start];
s[start] = tmp;
reverse(s,start + 1,end - 1);
}
}
PS:抱歉我的英语不好,我不是母语人士。