c - 在 C 中使用 return 和 putBack 函数递归地反转字符串
问题描述
所以作为作业,我需要递归地实现reverseRec函数。我不能使用任何循环,但必须在其中使用 putBack 函数,并且该函数需要返回一些东西,这使一切变得不必要地复杂。所以在递归到达字符串的末尾后,它就返回了。例如,如果字符串是“ABC”,那么它会变为 ABC-->BC-->C-->/0--> C --> B C--> A BC。我的想法是,我以某种方式保存每个返回 recusion 的字符串 (*s) 的开头,并将它们与 putBack 函数一起添加到CBA. 但我认为这是行不通的,因为它是一个递归,这意味着我无法从任何递归深度保存任何东西,因为它会被覆盖,对吧?我觉得我错过了一些关于递归和缓冲区如何在 C 中工作的东西,但是 idk。
#include "stdio.h"
#include "stdlib.h"
int length(char *s) {
int n = 0;
while(*s != '\0') {
n++;
s++;
}
return n;
}
void copy(char* s, int n, char* t) {
int i = 0;
while(i < n) {
t[i] = s[i];
i++;
}
}
char* putBack(char* s, char c) {
const int n = length(s);
char* r = malloc(sizeof(char) * (n+2));
copy(s, n, r);
r[n] = c;
r[n+1] = '\0';
return r;
}
char* reverseRec(char *s){
if(*s){
reverseRec(s+1);
s = putBack(s, *(s-1)); //???
}
return s;
}
int main() {
printf("%s", reverseRec("ABC"));
}
解决方案
示例输入字符串“12345”必须变为“54321”,您的教授给了您提示。递归将输入字符串分解成更小的部分,然后一个接一个地构建在一起。这意味着输入字符串“12345”的“递归步骤”数量为五个
提示 1:reverseRec( ) 的
输入 输入 1:“12345”
输入 2:“2345”
输入 3:“345”
输入 4:“45”
输入 5:“5”
提示 2:每个 reverseRec( ) 的输出输出 1 :
“54321”
输出 2:“5432”
输出 3:“543”
输出 4:“54”
输出 5:“5”
提示 3:由于 reverseRec( ) 调用自身,它返回一个值。可以使用该值。
reverseRec 1( string ) 得到 "5434"
reverseRec 2( string ) 得到 "543" (被调用的 reverseRec3 返回 "543" )
reverseRec 3( string ) 得到 "54" (被调用的 reverseRec4 返回 "
reverseRec 5( string ) 什么也得不到(没有调用下一个 reverseRec 来从中获取值)
提示 4:现在您从提示 1 获得了一组信息和一个缺失的目标
给定信息(输入):
来自提示 2 的给定信息(输出) :
提示 3 的返回值:
reverseRec 1( string ) 得到“5434”,应该返回“54321”,给定输入字符串“12345”
reverseRec 2( string ) 得到“543”,应该返回“5432”,给定输入字符串“2345” "
reverseRec 3( string ) 得到 "54",应该返回 "543",给定输入字符串 "345"
reverseRec 4( string ) 得到 "5",应该返回 "54",给定输入字符串 "45"
reverseRec 5( string ) 什么也没得到,返回 5,给定输入“5”
提示 5:缺少的目标
你必须为步骤 4,3,2,1 创建 [should return "output"]
你得到了返回值、输入字符串和 putBack
信息是工作的 80% ;) 现在坐下来测试一些想法putback,
或者使用调试器一步一步去看看什么时候发生的。
reverseRec( ) {
// 递归魔法
推荐阅读
- javascript - 如何根据 javascript 值使动画持续时间动态
- android - 如何获得 BLUETOOTH_PRIVILEGED 权限以在路由设备中自动配对设备而不将其放在系统应用程序中?
- javascript - 为什么控制台登录库不起作用,当它已被导入到不同的反应组件时?
- c# - 将一个列表中的字符串项目与另一个列表中项目的字符串属性进行比较
- mongoose - 如何填充存在于其他子对象中的子文档
- reactjs - 如何在 i18next 翻译字符串中的替换标签之间保留空格字符
- ruby-on-rails - 在activeadmin中编辑父记录的关系
- qt - 如何在粘贴到 TextFIeld 之前从剪贴板修改字符串?
- linux - 捕获信号时如何正确等待bash子进程完成
- r - 测试数据时间序列 - 如何合并 2 个数据集?