撰寫函式 `void reverse_string(char *string)`,使用遞迴將字串原地反轉,不得使用 C 標準庫字串函式(如 `strlen`, `strrev`)。
#include#include // 自訂字串長度 int my_strlen(const char *str) { assert(str); int count = 0; while (*str++) count++; return count; } // 遞迴反轉 void reverse_string(char *str) { assert(str); int len = my_strlen(str); if (len <= 1) return; // 基底案例 char temp = str[0]; str[0] = str[len - 1]; str[len - 1] = '\0'; // 暫時截斷,縮小問題 reverse_string(str + 1); // 遞迴處理中間子字串 str[len - 1] = temp; // 還原尾部字元 } int main() { char arr[] = "abcdef"; printf("原字串: %s\n", arr); reverse_string(arr); printf("反轉後: %s\n", arr); // 輸出: fedcba return 0; }
reverse("abc")
len=3, temp='a', str="\0bc" -> reverse("bc")
len=2, temp='b', str="\0c" -> reverse("c")
len=1 -> return
str[1]='b' -> "cb"
str[2]='a' -> "cba"
void reverse_iterative(char *str) {
assert(str);
char *left = str;
char *right = str + my_strlen(str) - 1;
while (left < right) {
char tmp = *left;
*left++ = *right;
*right-- = tmp;
}
}
迭代版 O(n) 時間、O(1) 空間,無函式呼叫開銷,實務上推薦使用。
遞迴反轉字串是經典教學範例,展示「分治」思想:將大問題分解為「交換首尾 + 解決中間子問題」。雖然實務上迭代更佳,但理解遞迴版本有助於建立遞迴思維,並掌握字串指標操作的精髓。