使用递归打印字符串的反转

Print the reverse of a string using recursion

我正在尝试使用递归反向打印字符串。但是,下面的程序无法按预期运行。是什么原因?

#include <stdio.h>

int main()
{
    char arr[]="rama";
    fun(arr);
}

int fun(char *p)
{
    static int i=0;
    
    if((p[i]) == '[=10=]')
       return;
    else
    {
        i++;
        fun(p[i]);
        printf("%c", p[i]);
    }
}

可能您正在寻找:

void fun(char *p) {
    if (*p) {
        fun(p + 1);
        printf("%c", *p);
    }
}

程序将 char 类型传递给递归情况下的函数,而您希望它是一个指针。只给定一个字符迭代一个字符串是不可能的,我们需要知道我们在字符串中的位置

正如各种评论所指出的,使用 static 缺少编写递归函数的要点,因为它有效地引入了全局变量。 事实上,根本没有必要使用索引变量。您可以简单地将指针用作参数和参数。取消引用它以获得当前指向的字符,并增加它以使其指向下一个字符。

更正了代码,并进行了一些改进:

#include <stdio.h>

// Declare the function before it is used.
// It doesn't return anything, so the return type should be "void".
void fun(char *p);

int main(void) // Correct main signature when not using command line arguments
{
    char *arr = "rama"; // We are not modifying the string, so a pointer to a string literal will do
    fun(arr);
    putchar('\n'); // Print a newline at the end of the program
}

void fun(char *p)
{
    if (*p == '[=10=]') // Get the character the pointer currently points to
        return; // No need for an else if we return here

    fun(p + 1); // Pass the increment pointer
    putchar(*p); // Print the dereferenced pointer. No need for printf if we're just printing a single char
}

另一种选择是使函数尾递归 (灵感来自 Eugene Sh. 的评论)。这需要一个额外的索引参数,但让我们以基本情况打印最后的换行符。

#include <stdio.h>
#include <string.h>

void fun(char *p, size_t idx);

int main(void)
{
    char *arr = "rama";
    fun(arr, strlen(arr) - 1);
}

void fun(char *p, size_t idx)
{
    // Happens in both the base case and recursive case
    putchar(p[idx]);

    // Base case
    if (idx == 0U)
    {
        putchar('\n');
        return;
    }

    // Recursive case
    fun(p, idx - 1);
}

您的乐趣 return 类型为 int,但您没有 returning 任何整数。 你必须在 main 之前声明函数,因为 fun 的主体在 main 之下。 有趣的是接收类型 char * 但你发送的是 char。

#include <stdio.h>
int fun(char *p);
int main(){
    char arr[]="rama";
    fun(arr);
}

int fun(char *p){
    static int i=0;
    if((p[i]) == '[=10=]')
       return 0;
    fun((p+1));
    printf("%c", p[i]);
}