C 带字符串的递归
我需要编写一个递归函数,它得到一个字符串,然后从末尾到开头只打印字母(大写和小写)C 带字符串的递归,c,recursion,C,Recursion,我需要编写一个递归函数,它得到一个字符串,然后从末尾到开头只打印字母(大写和小写) for exemple: str={"abc123#@!456DEF&^65gHj"} Reducing(str); output: jHgFEDcba . 但是我被困在如何让函数进入下一个字符的部分 我所能做的就是打印最后一个字符,就这样我卡住了。。。请帮忙 here's my code: void Reducing(char str[]) { if (str[0] == '\0')
for exemple:
str={"abc123#@!456DEF&^65gHj"}
Reducing(str);
output: jHgFEDcba .
但是我被困在如何让函数进入下一个字符的部分
我所能做的就是打印最后一个字符,就这样我卡住了。。。请帮忙
here's my code:
void Reducing(char str[])
{
if (str[0] == '\0')
return ;
if ((str[strlen(str)-1] <= 122 && str[strlen(str)-1] >= 97) || (str[strlen(str)-1] <= 90 && str[strlen(str)-1] >= 65))
putchar(str[strlen(str)-1]);
Reducing(str+(strlen(str)));
}
这是我的代码:
减空(字符str[])
{
如果(str[0]='\0')
返回;
如果((str[strlen(str)-1]=97)|(str[strlen(str)-1]=65))
putchar(str[strlen(str)-1]);
还原(str+(strlen(str));
}
我相信这个练习的全部要点是在递归步骤中,将字符串向下移动一个字符,直到到达末尾,然后在返回的过程中打印当前字符(在递归调用之后)。您不应该使用strlen
字符串是内存中以零(或NUL)字符结尾的字符序列。提供字符串中第一个字符的地址允许您通过向地址添加偏移量来查找所有其他字符。字符串也可以被看作是一条有头(第一个字符)和尾巴(其余字符)的蛇。头是位于字符串地址的单个字符。
尾部是位于地址加1处的字符串
为了向后打印字符串,如果字符串是空的(它的头是NUL),那么我们不必做任何事情。否则,如果我们通过递归调用backwards print函数向后打印尾部,然后打印头字符,那么我们就完成了我们的目标。我认为整个练习的重点是在递归步骤中向下移动字符串一个字符,直到到达末尾,然后在返回的过程中打印当前字符(在递归调用之后)。您不应该使用
strlen
字符串是内存中以零(或NUL)字符结尾的字符序列。通过提供字符串中第一个字符的地址,可以通过向地址添加偏移量来查找所有其他字符。字符串也可以被视为有头(第一个字符)和尾巴的蛇(剩余字符)。头是位于字符串地址的单个字符。
尾部是位于地址加1处的字符串
为了向后打印字符串,如果字符串为空(其头部为NUL),那么我们不必做任何事情。否则,如果我们通过递归调用向后打印函数向后打印尾部,然后打印头字符,那么我们就完成了我们的目标。首先,通常用于读取字符串的接口是:
void reduction(const char*);
如果要对字符串文本(通常需要)调用函数,常量在这里很重要
其次,c标准库在标题中提供了isalpha()
等函数,用于检查字符是否属于某些标准类别
最后但并非最不重要的一点是,您真正想要做的是查看下一个字符,因此将指针向前移动一个字符,然后再次调用自己,直到您读取
'\0'
首先,您通常用于读取字符串的接口是:
void reduction(const char*);
如果要对字符串文本(通常需要)调用函数,常量在这里很重要
其次,c标准库在标题中提供了isalpha()
等函数,用于检查字符是否属于某些标准类别
最后但并非最不重要的一点是,您真正想要做的是查看下一个字符,因此将指针向前移动一个字符,然后再次调用自己,直到您读取一个
'\0'
如何使用str[0]
而不是str[strlen(str)-1]
并传递递归的str+1
:
void Reducing(char str[])
{
if (str[0] == '\0')
return ;
if ((str[0] <= 122 && str[0] >= 97) ||
(str[0] <= 90 && str[0] >= 65))
putchar(str[0]);
Reducing(str + 1);
}
void reduction(char str[])
{
如果(str[0]='\0')
返回;
如果((str[0]=97)||
(str[0]=65))
putchar(str[0]);
减少(str+1);
}
如何使用str[0]
而不是str[strlen(str)-1]
并传递str+1
进行递归:
void Reducing(char str[])
{
if (str[0] == '\0')
return ;
if ((str[0] <= 122 && str[0] >= 97) ||
(str[0] <= 90 && str[0] >= 65))
putchar(str[0]);
Reducing(str + 1);
}
void reduction(char str[])
{
如果(str[0]='\0')
返回;
如果((str[0]=97)||
(str[0]=65))
putchar(str[0]);
减少(str+1);
}
你能做一个更简单的版本吗,就是按原样反转字符串?然后将其修改为filter。并提示:它不应该是尾部递归(可以,但你忽略了这一点)。不要在每次迭代时尝试计算strlen。只需在每次迭代时向上移动一个字符,然后松开。使用isalpha()
将更干净,并删除神奇的数字。我不明白你如何移动一个字符???我建议你尝试:)它大量使用头递归。你能不能制作一个简单的版本,只是按原样反转字符串?然后将其修改为过滤器。并提示:它不应该是尾递归(当然,它可以,但你失去了重点)。不要在每次迭代时尝试计算strlen
。只需在每次迭代时向上移动一个字符,然后松开。使用isalpha()
将更干净,并删除神奇的数字。我不明白您如何移动一个字符???我建议您尝试:)它大量使用head递归。那么我应该如何将字符串向下移动一个字符??@pat。我删除了我的答案。OP需要的是步行课,而不是钓鱼课。str
是指向内存中连续字符数组的指针。当然,它被声明为数组,但作为函数的参数,它实际上是一个指针。您可以将字符类型从char[]
更改为char*
,使其更为明显。我不明白你们的意思,请对我放松点,我是新来的that@monkey.D.Ganga你需要知道一个基本的术语,以便正确地传达这些信息。如果你不