char *reverse(char *str) {
if (!str) return NULL;
int len = strlen(str);
for (int l = 0, r = len - 1; l < r; ++l, --r) {
char tmp = str[l];
str[l] = str[r];
str[r] = tmp;
}
return str;
}
void reverse_print(const char *str) {
if (!str || !*str) return;
reverse_print(str + 1); // 先遞歸到末尾
putchar(*str); // 回溯時輸出
}
int my_strlen(const char *s) {
return *s ? 1 + my_strlen(s+1) : 0;
}
char *reverse_recursive(char *str, int len) {
if (len <= 1) return str;
char tmp = str[0];
str[0] = str[len-1];
str[len-1] = '\0'; // 暫時截斷,避免下層處理末尾
reverse_recursive(str + 1, len - 2);
str[len-1] = tmp; // 恢復末尾字符
return str;
}
int main() {
char s[] = "abcdef";
reverse_recursive(s, my_strlen(s));
printf("%s\n", s); // fedcba
return 0;
}
| 方法 | 修改原串 | 空間 | 適用場景 |
|---|---|---|---|
| 雙指針 | 是 | O(1) | 生產環境首選 |
| 遞歸打印 | 否 | O(n) | 僅需反序輸出 |
| 遞歸原地 | 是 | O(n) | 教學/面試展示遞歸思想 |
生產代碼請使用 方法一。遞歸版僅用於理解「棧幀保存狀態、回溯時處理」的遞歸本質。