[英]Reverse String recursively in C with return and a putBack function
所以作為作業,我需要遞歸地實現reverseRec function。 我不能使用任何循環,但必須在其中使用 putBack function 並且 function 需要返回一些東西,這使一切變得不必要地復雜。 所以在遞歸到達字符串的末尾后,它就返回了。 例如,如果字符串是“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() 的輸出是
output 1:“54321”
output 2:“5432”
output 3:“543”
output 4:“54”
output 5:“5”
提示 3:由於 reverseRec() 調用自身,它返回一個值。 可以使用該值。
reverseRec 1(字符串)得到“5434”
reverseRec 2( string ) 得到 "543" (被調用的 reverseRec3 返回 "543" )
reverseRec 3( string ) 得到 "54" (被調用的 reverseRec4 返回 "54" )
reverseRec 4( string ) 得到 "5" (被調用的 reverseRec5 返回 "5" )
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 創建 [應該返回“輸出”]
你得到了返回值、輸入字符串和 putBack
信息是工作的 80%;)現在坐下來測試一些想法,放回原處,
或者使用調試器一步步調試到go看看什么時候發生。
反向記錄(){
// 遞歸魔法
從我的角度來看,你有兩個障礙需要克服。 第一個是使用putBack()
的遞歸,第二個是putBack()
malloc 在每個遞歸級別的字符串,您需要釋放這些字符串以避免 memory 泄漏。 這是我的解決方案:
char* reverseRec(char* s) {
if (length(s) > 1) {
char* r = putBack(reverseRec(s + 1), *s);
copy(r, length(r), s);
free(r);
}
return s;
}
由於我們正在反轉字符串,我們知道副本將始終適合原始字符串。 完整代碼:
#include <stdio.h>
#include <stdlib.h>
int length(char* s) {
int n = 0;
while (*s++ != '\0') {
n++;
}
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 = calloc(n + 2, sizeof(char));
copy(s, n, r);
r[n] = c;
r[n + 1] = '\0';
return r;
}
char* reverseRec(char* s) {
if (length(s) > 1) {
char* r = putBack(reverseRec(s + 1), *s);
copy(r, length(r), s);
free(r);
}
return s;
}
int main(int argc, char* argv[]) {
printf("%s\n", reverseRec(argv[1]));
return 0;
}
這假設argv[]
字符串是可變的——如果不是,則將其復制到新的 malloc 字符串中。
OUTPUT
% ./a.out abcdef
fedcba
%
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.