一.递归实现字符串逆序排序递归的核心思想交换第一个字符和最后一个字符把中间剩下的字符串再递归逆序直到字符串长度 ≤1 停止递归出口。递归函数里递归上面的代码 → 递去的时候执行往前深入递归下面的代码 → 归来的时候执行回溯往回走。二.代码#define_CRT_SECURE_NO_WARNINGS#includestdio.h//编写一个函数reverse_string(char* string)(递归实现)//实现将参数字符串中的字符反向排序不是逆序打印。//要求不能使用C函数库中的字符串操作函数。//求字符串长度函数intmy_strlen(char*str){intcount0;while(str[count]!\0){count;}returncount;}//递归实现字符串逆序排序//递归的核心思想//1. 交换第一个字符和最后一个字符//2. 把中间剩下的字符串再递归逆序//3. 直到字符串长度 ≤1 停止递归出口//递归函数里//递归上面的代码 → 递去的时候执行往前深入//递归下面的代码 → 归来的时候执行回溯往回走voidreverse_string(char*str){// 递归出口只剩0或1个字符不用逆序if(my_strlen(str)1)return;intlenmy_strlen(str);charleft_char*str;// 保存第一个字符*str*(strlen-1);// 把最后一个字符放到最前面*(strlen-1)\0;// 最后一位置\0统计字符串长度遇\0结束新需要判断的字符串终点标志。reverse_string(str1);// 递归逆序中间部分*(strlen-1)left_char;// 恢复最后一位 先把所有递归全部调用完 → 一层一层往回退 → 退回来的时候才执行这行}// 循环法字符串逆序排序voidreverse_string1(char*str){intleft0;intrightmy_strlen(str)-1;while(leftright){// 交换首尾chartempstr[left];str[left]str[right];str[right]temp;left;right--;}}intmain(){charstr[101]{0};// 初始化全0安全inti0;printf(请输入100个以内的字符\n);//scanf 读取一个字符读取成功 → 返回 1/* 同时满足 2 个条件循环才继续 1. 还没存满 100 个字符i 100 2. 成功读取到了一个字符scanf(%c, str[i]) 1*/// 正确循环先读判断再自增while(i100scanf(%c,str[i])1){if(str[i]\n){// 回车结束输入break;}i;}str[i]\0;// 最后必须加字符串结束符printf(你输入的内容是%s\n,str);intszmy_strlen(str);printf(你总共输入的字符数字为%d\n,sz);reverse_string(str);printf(递归法排序后内容是%s\n,str);reverse_string1(str);printf(循环法排序后内容是%s\n,str);//逆向排序了两次变成正向输出return0;}三. 运行结果
C语言学习笔记20260526—递归/循环法实现字符串逆序排序
一.递归实现字符串逆序排序递归的核心思想交换第一个字符和最后一个字符把中间剩下的字符串再递归逆序直到字符串长度 ≤1 停止递归出口。递归函数里递归上面的代码 → 递去的时候执行往前深入递归下面的代码 → 归来的时候执行回溯往回走。二.代码#define_CRT_SECURE_NO_WARNINGS#includestdio.h//编写一个函数reverse_string(char* string)(递归实现)//实现将参数字符串中的字符反向排序不是逆序打印。//要求不能使用C函数库中的字符串操作函数。//求字符串长度函数intmy_strlen(char*str){intcount0;while(str[count]!\0){count;}returncount;}//递归实现字符串逆序排序//递归的核心思想//1. 交换第一个字符和最后一个字符//2. 把中间剩下的字符串再递归逆序//3. 直到字符串长度 ≤1 停止递归出口//递归函数里//递归上面的代码 → 递去的时候执行往前深入//递归下面的代码 → 归来的时候执行回溯往回走voidreverse_string(char*str){// 递归出口只剩0或1个字符不用逆序if(my_strlen(str)1)return;intlenmy_strlen(str);charleft_char*str;// 保存第一个字符*str*(strlen-1);// 把最后一个字符放到最前面*(strlen-1)\0;// 最后一位置\0统计字符串长度遇\0结束新需要判断的字符串终点标志。reverse_string(str1);// 递归逆序中间部分*(strlen-1)left_char;// 恢复最后一位 先把所有递归全部调用完 → 一层一层往回退 → 退回来的时候才执行这行}// 循环法字符串逆序排序voidreverse_string1(char*str){intleft0;intrightmy_strlen(str)-1;while(leftright){// 交换首尾chartempstr[left];str[left]str[right];str[right]temp;left;right--;}}intmain(){charstr[101]{0};// 初始化全0安全inti0;printf(请输入100个以内的字符\n);//scanf 读取一个字符读取成功 → 返回 1/* 同时满足 2 个条件循环才继续 1. 还没存满 100 个字符i 100 2. 成功读取到了一个字符scanf(%c, str[i]) 1*/// 正确循环先读判断再自增while(i100scanf(%c,str[i])1){if(str[i]\n){// 回车结束输入break;}i;}str[i]\0;// 最后必须加字符串结束符printf(你输入的内容是%s\n,str);intszmy_strlen(str);printf(你总共输入的字符数字为%d\n,sz);reverse_string(str);printf(递归法排序后内容是%s\n,str);reverse_string1(str);printf(循环法排序后内容是%s\n,str);//逆向排序了两次变成正向输出return0;}三. 运行结果