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

看板Programming作者 (墳墓)時間6年前 (2018/10/19 17:00), 編輯推噓0(003)
留言3則, 2人參與, 6年前最新討論串3/4 (看更多)
※ 引述《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://www.ptt.cc/bbs/Programming/M.1539939629.A.9B5.html

10/22 09:21, 6年前 , 1F
人家要找字元出現次數,不是找字串長
10/22 09:21, 1F

10/22 09:21, 6年前 , 2F
度耶
10/22 09:21, 2F

10/22 18:56, 6年前 , 3F
我眼殘看錯題目了 orz
10/22 18:56, 3F
文章代碼(AID): #1RoPqjcr (Programming)
討論串 (同標題文章)
文章代碼(AID): #1RoPqjcr (Programming)