close

[程式語言] C++

 運用遞迴的概念 寫一個 is_plaindrome(string text) 函式 判斷 輸入 函式的 text 字串是否是一個迴文字串。

迴文字串: 一個字串倒反過來依然不變, 例如: aba 倒過來還是 aba , 那麼 is_plaindrome(“aba”) 就會回傳 true .

 

函式

string is_plaindrome( string text)

Input :

    string text - 受檢測字串

Output :
    true/false

 

執行結果:

`程式設計[5] 遞迴判斷迴文字串

[演算法]

  1. 終止條件:
  • 當遞迴呼叫到檢測字串只剩一個字元時,由於一個字元必然是迴文,故回傳 true
  • 當遞迴呼叫到檢測字串只剩二個字元時,如果二個字元相同則必然是迴文,回傳 true,否則 回傳false
  1. 遞迴呼叫: 當一個檢測字串頭尾字元都相同,則去掉頭尾之後再遞迴呼叫檢測一次,直到終止條件發生;反之頭尾字元不相符時則可直接判斷為非迴文,回傳 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;

 

[程式說明]

  1. main 函式要求使用者輸入一個檢測字串,然後呼叫 is_plaindrome() 函式 判斷該字串是否式迴文。
  2. 獲取 CPP String 中特定位置的字元 : 利用 string字串.at(index) , 傳回 string字串中的 索引位置為 index 的 的字元

string text = “abc”
char c = text.at(0) // c=’a'

  1. 可以用一行程式簡化回傳 if-else 判斷的結果:

if (length == 2) return (text.at(0) == text.at(1)); // 只有兩個字母時,只要字母相同便是迴文字串

  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;
}

2024109日星期三

arrow
arrow
    創作者介紹
    創作者 jackterrylau 的頭像
    jackterrylau

    儒道哲學的浪漫人生

    jackterrylau 發表在 痞客邦 留言(0) 人氣()