[程式語言] C++
運用遞迴的概念 寫一個 is_plaindrome(string text) 函式 判斷 輸入 函式的 text 字串是否是一個迴文字串。
迴文字串: 一個字串倒反過來依然不變, 例如: aba 倒過來還是 aba , 那麼 is_plaindrome(“aba”) 就會回傳 true .
函式:
string is_plaindrome( string text)
Input :
string text - 受檢測字串
Output :
true/false
執行結果:
`
[演算法]
- 終止條件:
- 當遞迴呼叫到檢測字串只剩一個字元時,由於一個字元必然是迴文,故回傳 true
- 當遞迴呼叫到檢測字串只剩二個字元時,如果二個字元相同則必然是迴文,回傳 true,否則 回傳false
- 遞迴呼叫: 當一個檢測字串頭尾字元都相同,則去掉頭尾之後再遞迴呼叫檢測一次,直到終止條件發生;反之頭尾字元不相符時則可直接判斷為非迴文,回傳 false。
1. int length = text.length();
2. if (length == 1) return true; // 只有一個字母必是迴文字串
3. if (length == 2) return (text.at(0) == text.at(1)); // 只有兩個字母時,只要字母相同便是迴文字串
4. // 開頭與結尾字母若相同,則去掉頭尾後繼續判斷新的字串是否也是迴文字串, 此處用遞迴法來檢查結果
5. if (text.at(0) == text.at(length-1)) return is_plaindrome(text.substr(1, length-2));
6. else return false;
[程式說明]
- main 函式要求使用者輸入一個檢測字串,然後呼叫 is_plaindrome() 函式 判斷該字串是否式迴文。
- 獲取 CPP String 中特定位置的字元 : 利用 string字串.at(index) , 傳回 string字串中的 索引位置為 index 的 的字元
string text = “abc”
char c = text.at(0) // c=’a'
- 可以用一行程式簡化回傳 if-else 判斷的結果:
if (length == 2) return (text.at(0) == text.at(1)); // 只有兩個字母時,只要字母相同便是迴文字串
- 在 std::cout 中 運用 std::cout << boolalpha 可以將有boolean意義的 0,1 的數值轉換成 false/true 後輸出。
1.// 沒有 boolalpha 時 is_plaindrome(s) 直接 cout 會變成 0, 1
cout << "The String " << s << " is a plaindrome ? " << is_plaindrome(s) << endl;
2. // 在cout中加入 boolalpha 後, is_plaindrome(s) 的 cout 會是預期的 true, false
cout << "The String " << s << " is a plaindrome ? " << boolalpha << is_plaindrome(s) << endl;
[程式碼] is_plaindrome.cpp
GitHub : SchoolCode/CPP/is_plaindrome.cpp at master · jackterrylau/SchoolCode (github.com)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /*** * function : * bool is_plaindrome(string) * Description: * 這是使用 遞迴 方式 寫成檢查字串是否是迴文的 function is_plaindrome * Algorithm: * 1. 終止條件: * 1.1 字串長度為1時 即為迴文 * 1.2 字串長度為2時 如果是重複的字元,即為迴文,否則不是 * 2. 遞迴: 當字串檢查頭尾一致時,則遞迴檢查去除頭尾後的字串是否為迴文 * */ using namespace std; #include <iostream> bool is_plaindrome(string text) { int length = text.length(); if (length == 1) return true; // 只有一個字母必是迴文字串 if (length == 2) return (text.at(0) == text.at(1)); // 只有兩個字母時,只要字母相同便是迴文字串 // 開頭與結尾字母若相同,則去掉頭尾後繼續判斷新的字串是否也是迴文字串, 此處用遞迴法來檢查結果 if (text.at(0) == text.at(length-1)) return is_plaindrome(text.substr(1, length-2)); else return false; } int main() { cout << "This is a checking function for judging a string to see if it is a plaindrome(迴文)."<<endl; cout << "-----------------------------------" <<endl; cout << "Input a String : "; string s; cin >> s; // Add boolalpha to covert bool value(0,1) to boolean string cout << "The String " << s << " is a plaindrome ? " << boolalpha << is_plaindrome(s) << endl; return 0; } |
2024年10月9日星期三
留言列表