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