[討論] 令人印象深刻的遞迴問題?

看板C_and_CPP作者 (purpose)時間13年前 (2011/03/31 13:18), 編輯推噓18(18029)
留言47則, 15人參與, 最新討論串1/9 (看更多)
看到有人在板上找遞迴題目,說要拿來練習。 這讓我想到以前上課時,學校老師提過一個考古題,關於股票買賣的: 若有某公司的股價 double price[] = {55.39, 109.23, 48.29, 81.59, 81.58, 105.53, 94.45, 12.24}; 其中 55.39 表示第一天的價格、109.29 為第二天的價格。 不能在同一天同時進行購買與販賣。 寫一個「遞迴函數」,用來求出獲利最大的買賣方式。 當初想很久都沒想到,看到公佈的答案後,又覺得確實合理,所以讓我印象深刻。 不知道大家有沒有碰過什麼遞迴問題,也讓你印象深刻的,不妨交流一下吧。 ######## 就算不論遞迴,這個股票問題本身很單純,敘述沒有幾行,但是卻有很多種解法。 其中,最優雅的解法是用非遞迴寫的。其背後需要的是,全面的分析並且整合。 像這麼有意思的問題,總覺得應該很有名,不會就叫考古題吧? 不知道有沒有專門的稱呼呢? 謝謝回答 在 stackoverflow.com 有看到外國人討論這個問題,說是面試的題目。 然後底下的網友在猜是不是知名公司 Bloomberg (彭博) 的面試。網址在: http://stackoverflow.com/questions/1663545/find-buy-sell-prices-in-array-of- stock-values-to-maximize-positive-difference 上面太長了, 短網址在:http://tinyurl.com/yguddsv 該網址裡面有問題的解答,包含最佳解,還不想看解答,要自己想看看的,先別點進去! 股票問題,我之前寫的非遞迴版本,不是最佳解,也不是最爛的解法: http://codepad.org/kfSdX64d 股票買賣的遞迴解: 作答提示 (先想過,再看提示吧): http://ppt.cc/lVKy 參考答案 (不想猜了,可以看這): http://codepad.org/NlcM35W1 03/31 PM 08:50 修文補充 題目沒有描述清楚,跟版友道歉,以下轉貼外國人敘述的題目說明 Given a single array of real values, each of which represents the stock value of a company after an arbitrary period of time, find the best buy price and its corresponding best sell price (buy low, sell high). To illustrate with an example, let's take the stock ticker of Company Z: 55.39 109.23 48.29 81.59 105.53 94.45 12.24 Important to note is the fact that the array is "sorted" temporally - i.e. as time passes, values are appended to the right end of the array. Thus, our buy value will be (has to be) to the left of our sell value. (in the above example, the ideal solution is to buy at 48.29 and sell at 105.53) 也謝謝大家提供遞迴問題 另外詢問有沒有教科書上沒提過,但是在你們工作、做專案的時候碰到, 讓你寫完這個遞迴後印象深刻的?小弟想長長見識,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.139.40

03/31 13:43, , 1F
河內塔跟費伯納西數列應該都是經典
03/31 13:43, 1F

03/31 13:45, , 2F
推樓上,小弟大一時被 河內塔 搞的團團轉。
03/31 13:45, 2F

03/31 13:49, , 3F
資料結構 的 Binary Search 和 Maze(走迷宮)。
03/31 13:49, 3F

03/31 14:06, , 4F
再頭痛一點的 - 8皇后問題
03/31 14:06, 4F

03/31 14:07, , 5F
另外像是組合數學裡面的 排列組合計算
03/31 14:07, 5F

03/31 14:09, , 6F
Knight Tour(騎士旅行)。
03/31 14:09, 6F

03/31 15:21, , 7F
請問在這個問題裡 是要求每天都要買進或賣出嗎?
03/31 15:21, 7F

03/31 15:47, , 8F
是指固定初始成本的最大獲利嗎?
03/31 15:47, 8F

03/31 15:53, , 9F
看來是只能進場一次
03/31 15:53, 9F

03/31 16:07, , 10F
對只能挑一天買、並挑另一天賣,該次買賣差價最大為答案
03/31 16:07, 10F

03/31 16:09, , 11F
以上面的 double price[] 為例,答案是在第三天 48.29 時
03/31 16:09, 11F

03/31 16:10, , 12F
買入,並在第六天 105.53 時賣出,此時單次交易利潤最大
03/31 16:10, 12F

03/31 20:10, , 13F
是喔那為啥要 "不能在同一天同時進行購買與販賣"
03/31 20:10, 13F

03/31 20:11, , 14F
同一天買賣一定不是最大穫利啊
03/31 20:11, 14F

03/31 20:21, , 15F
怎麼回事,這幾天是遞迴大爆發嗎?
03/31 20:21, 15F

03/31 20:21, , 16F
小弟 猜測 原題目的 "不能在同一天又買又賣" 的意思為:
03/31 20:21, 16F

03/31 20:22, , 17F
不能在同日 賣出 之前已經買的股票 ,
03/31 20:22, 17F

03/31 20:23, , 18F
又 買進 當日價格 的 股票。
03/31 20:23, 18F

03/31 20:23, , 19F
例如: 55.39 買進 , 81.59 賣出
03/31 20:23, 19F

03/31 20:24, , 20F
81.59 買進 , 105.53 賣出 。
03/31 20:24, 20F

03/31 20:24, , 21F
這種操作 是 不被題目允許的。
03/31 20:24, 21F

03/31 20:27, , 22F
問題在於上面的推文指出只能進場一次... lol
03/31 20:27, 22F

03/31 20:29, , 23F
感謝E大提醒,那這樣我就不知道了。 @@"
03/31 20:29, 23F

03/31 20:39, , 24F
簡單的想法是看兩次, 第一次記錄一路上的最小值
03/31 20:39, 24F

03/31 20:39, , 25F
邊紀錄邊以現在看到的數字減掉已知最小的數字存另一陣列
03/31 20:39, 25F

03/31 20:40, , 26F
之後在另一陣列找最大值為解
03/31 20:40, 26F

03/31 20:41, , 27F
感覺只要掃一次即可
03/31 20:41, 27F

03/31 20:43, , 28F
回E大,那應該是我的錯,原本的題目沒抄下來,照印象打的
03/31 20:43, 28F

03/31 20:43, , 29F
LOL 也是, 直接合併在一起比最大值就可以了
03/31 20:43, 29F
※ 編輯: purpose 來自: 124.8.139.40 (03/31 20:56)

04/01 00:25, , 30F
遞回解數獨算不算~
04/01 00:25, 30F

04/01 04:06, , 31F
我的想法是輸入砍到剩極大/極小值, 皆作排序, 極小搭
04/01 04:06, 31F

04/01 04:07, , 32F
04/01 04:07, 32F

04/01 04:08, , 33F
最大, 次大, 第三大...等, 直到找到合法序對的為止,
04/01 04:08, 33F

04/01 04:09, , 34F
再來是次小也作一次, 直到找出的利潤沒有進步空間為止
04/01 04:09, 34F

04/01 04:11, , 35F
價格可以離散化再做排序O(n), 找序對最差O(n^2)
04/01 04:11, 35F

04/01 04:14, , 36F
後來想到排序要考慮到鍵值的可能性, 所以應該O(nlogn)
04/01 04:14, 36F

04/01 04:19, , 37F
不過再多想幾次還是會通的啦! 面試題目沒有兩小時考得
04/01 04:19, 37F

04/01 04:19, , 38F
出來嗎?
04/01 04:19, 38F

04/01 06:36, , 39F
股票可以允許知道未來的價格做排序嗎?
04/01 06:36, 39F

04/01 06:50, , 40F
看來是不能排序,不能後天買進今天要賣的股票~這個沒有放空
04/01 06:50, 40F

04/01 09:23, , 41F
數獨的規則我不太清楚,但課本沒提過,應該算
04/01 09:23, 41F

04/01 09:24, , 42F
面試,如果我第一次碰到,應該就是掛了。這題要解遞迴,我
04/01 09:24, 42F

04/01 09:24, , 43F
們老師說是考古題,我也沒辦法拿分,我們老師倒是說他當場
04/01 09:24, 43F

04/01 09:25, , 44F
就解出來...經驗老到加上本身強,解題就是快
04/01 09:25, 44F

04/01 11:16, , 45F
用遞迴算多階行列式的值
04/01 11:16, 45F

04/01 18:29, , 46F
中文的敘述要加入,只能買和賣各一次
04/01 18:29, 46F

04/02 07:27, , 47F
比較像是DP吧
04/02 07:27, 47F
文章代碼(AID): #1Db0wlzg (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Db0wlzg (C_and_CPP)