反向功能

时间:2016-02-09 09:11:46

标签: c

(我不会说英语,所以我很抱歉我的错误)

我正在学习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;
}

但它不起作用。你能帮帮我吗?

3 个答案:

答案 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:抱歉我的英语不好,我不是母语人士。