作者brianhsu (坟墓)
看板Programming
标题Re: [问题] 回圈改递回请益
时间Fri Oct 19 17:00:21 2018
※ 引述《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 就好
--
~
白马带着她一步步地回到中原。白马已经老了,只能慢慢地走,
'v'
Brian Hsu 但终是能回到中原的。江南有杨柳、桃花,有燕子、金鱼……
// \\
( 坟 墓 )
/( )\
但这个美丽的姑娘就像古高昌国人那样固执。 【白马啸西风】
^`~'^
http://brianhsu.moe 『那都是很好很好的,可我偏不喜欢。』
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 202.89.121.16
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Programming/M.1539939629.A.9B5.html
1F:→ adrianshum: 人家要找字元出现次数,不是找字串长 49.130.128.150 10/22 09:21
2F:→ adrianshum: 度耶 49.130.128.150 10/22 09:21
3F:→ brianhsu: 我眼残看错题目了 orz 223.137.40.12 10/22 18:56