Re: [問題] 迴圈改遞迴請益

作者: brianhsu (墳墓)   2018-10-19 17:00:21
※ 引述《RicciYeh (RicciYeh)》之銘言:
: 小弟第一次發文,若有違反版規的,請鞭小力點,謝謝。
: 小弟的題目,是尋找一個字串中,某個字母的出現次數
: 迴圈版本相當簡單,我還應付得來,程式碼如下:
: int countI(string s, char c)
: {
: int length = s.size(), cnt = 0;
: for (int i = 0; i < length; i++)
: if (s[i] == c)
: cnt++;
: return cnt;
: }
: 但遞迴的版本,我真的是一點頭緒也沒有
: int countR(string s, char c)
: {
: int length = s.size();
: if(s[length] == c)
: return 1 + countR(s, c);
: }
: 我原本是這樣寫,可是有一個很大的問題是 length 的值都一樣阿
: 每函式重進去一次,就會重新呼叫 length = s.size();
: 請求各位大神給點方向,感恩。
話說函式的參數一個就夠了。
int countR(std::string str) {
if (str[0] == '\0') {
return 0;
} else {
str.pop_back(); // 把字串其中一個字刪掉
return 1 + countR(str);
}
}
概念很簡單,其實無關語言,只要「去掉一個字」這個動作可以作,
就可以用這個版本。這個動作可以用 substring,指標往後指,刪掉
前面或後面的一個字元都可以。
簡單講就是這樣:
- 一個字串進來,他如果沒有內容,長度當然是 0
- 如果一個字串有內容,他的長度就是 1 + 去掉一個字後的字串長度
- 去掉一個字的字串長度怎麼算?
- 啊我就已經有 countR 了,所以只要把字串去掉一個字,再丟進 countR 就好

Links booklink

Contact Us: admin [ a t ] ucptt.com