使用递归打印字符串的反转
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]);
}
我正在尝试使用递归反向打印字符串。但是,下面的程序无法按预期运行。是什么原因?
#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]);
}