題目描述:統計某個字符在目標字符串中出現的次數
解題思路:
方法1:循環------逐個比較,統計次數
方法2:遞歸------遞歸也是一種特殊的循環
如果采用遞歸函數的思路來解決這個問題,那么整個統計過程就變為:從目標字符串的開始位置查找這個字符,如果找到,那么字符出現的次數就成了已經找到的這一次加上在剩下的字符串中出現的次數,在程序中我們可以用“1 + numOfchar(pos+1, c)”來表示,其中“1”表示已經找到的字符出現一次,而“numOfchar(pos+1, c)”則代表了字符在剩下的字符串中出現的次數,加起來剛好就是字符在整個字符串中出現的次數。這里的“numOfchar(pos+1, c)”就是在變更開始條件后對numOfchar()函數的遞歸調用,進行第二次查找與統計。第二次查找也會進行類似的查找統計過程,如果找到則會第三次調用numOfchar()函數繼續向后繼續查找統計。這個過程會不斷地持續進行下去,直到最后滿足遞歸的終止條件——查找到了字符串的結尾,再也找不到這個字符——為止。在這個過程中,有需要循環往復執行的相同動作——從字符串開始位置查找目標字符;有不同的開始條件——在字符串的不同位置開始查找;有終止條件——在字符串中再也找不到目標字符。
有了這三個特征,我們就可以用函數的遞歸調用更輕松而自然地解決這個問題
實現代碼:
/* 統計某個字符在目標字符串中出現的次數 */ #include <iostream> #include <cstring> // 引入字符查找函數strchr()所在的頭文件 using namespace std; /* 方法1: 循環實現函數功能 */ /* int numOfChar(const char *str, const char c) { int nTotal = 0; // 記錄字符出現次數 // 在字符串中查找字符,並對結果進行判斷 // 如果strchr()返回nullptr,則表示查找完畢,循環結束 while(nullptr != (str=strchr(str, c))) { ++nTotal; ++str; // 字符串往后移動,開始下一次循環 } return nTotal; } */ /* 方法2: 遞歸實現函數功能 */ int numOfChar(char *str, const char c) { // 從字符串str的開始位置查找字符c char *pos = strchr(str,c); // 如果strchr()函數的返回值為nullptr,則意味着 // 在字符串中再也找不到目標字符,遞歸的終止條件得到滿足 // 則結束函數的遞歸調用,直接返回本次的查找結果0 if(nullptr == pos) { return 0; } // 如果沒有達到終止條件,則將本次查找結果1統計在內, // 並在新的開始位置pos + 1開始下一次查找,實現函數的遞歸調用 return 1 + numOfChar(pos + 1,c); } int main() { char str[] = "Shanghai is a big city"; //給定字符串 char ch = 'h'; //目標字符 // 調用CountChar()函數進行統計 int nCount = numOfChar(str,ch); // 輸出結果 cout<<"字符\'"<<ch<<"\'在\""<<str<<"\"中出現了"<<nCount<<"次"<<endl; system("pause"); return 0; }
結果如下: