通过我们前两章对C语言函数和递归的学习,我们来做一题递归的题型
题型思路:
题目中心问题:将输入的字符串通过函数递归的方式输出逆向字符串
题目要求:使用递归实现代码,不能使用C函数库的字符串操作函数
大白话解题思路:
首先我们先考虑怎么用迭代的方式实现
①初始化一个char arr[ ],定义一个reverse_string 函数来实现字符反向排列在reverse_string函数当中需要定义两个整形变量来表示数组arr的首下标与尾下标,定义首下标为 int left=0,尾下标为int right,接下来要给right赋值,数组的尾下标是数组长度-1。
②由于我们不能使用C函数库中的字符串strlen操作函数来查字符个数,那就需要自定义一个函数,使用函数的嵌套调用,我们定义将第二个函数为my_strlen函数,因此int right=my_strlen(str)-1。在my_strlen函数中运用while循环我们将字符串的长度返回给right。
③现在我们在reversre_string函数中定义好了left和right的值,使用while循环将left<right设为条件,在left下标小于right的情况下将left下标所对应的字符通过新定义的中介变量tmp传给right,然后执行left++;right--;一直循环所有字符调换完,left大于right时跳出循环。
请看代码
迭代
#include<stdio.h>
int my_strlen(char* str)
{
int count=0;
while(*str!= '\0') //字符串最后会有 '\0'符 表结束
{
count++;
str++;
}
return count; //将字符长度值返回
}
void reversre_string(char* str)
{
int left=0;
int right=my_strlen(str)-1; //求数组的字符长度自定义一个strlen库函数
while(left<right)
{
char tmp=str[left];
str[left]=str[right]; //以下我会画图,图形去理解
str[right]=tmp;
left++;
right--;
}
}
int main()
{
char arr[]={};
scanf("%s",arr);
reversre_string(arr); //数组名arr是数组arr首元素地址
printf("%s\n",arr);
return 0;
}
递归
#include<stdio.h>
int my_strlen(char* str)
{
int count=0;
while(*str!= '\0') //字符串最后会有 '\0'符 表结束
{
count++;
str++;
}
return count; //将字符长度值返回
}
void reversre_string(char* str)
{
char tmp=*str; //字符型tmp=首地址的字符
int len=my_strlen(str);
*str=*(str+len-1); //将最后一个字符赋给首地址字符
*(str+len-1)='\0'; //将最后一个字符赋'\0',先不赋值首字符
//判断条件
if(my_strlen(str+1)>=2)
{
reversre_string(str+1);
}
*(str+len-1)=tmp; //将首字符赋给最后一个字符
}
int main()
{
char arr[]={};
scanf("%s",arr);
reversre_string(arr); //数组名arr是数组arr首元素地址
printf("%s\n",arr);
return 0;
}
画图理解递归思路