2013-04-26 74 views
1
let rec f a p n = if p n then a else a + f a p (n - 1) 
let a, p, n = 3, (fun x -> x = 1), 4 
f a p n 

當n < = 0時獲得stackoverflow。不知道如何解決這個問題。具有遞歸功能的Stackoverflow

+0

試圖在這裏建立代表。爲什麼要投票? – Iter 2013-04-26 18:18:15

回答

3

p = fun x -> x = 1其中,當然,檢查是否x是1

你的遞歸調用使用pn,否則遞減n

這將導致n變得越來越負,導致無限遞歸,因爲n永遠不會是1.要解決這個問題,您不需要調用p的值爲n小於1或更改您的檢查函數來執行除檢查值1以外的其他值。

也許嘗試let a, p, n = 3, (fun x -> x <= 1), 4

+0

還值得注意的是,如果'f'被做了尾遞歸,那麼代碼將按照原樣「工作」(即不會崩潰),因爲'n'最終會下溢並從'Int32.Max '到'1'。 – ildjarn 2013-04-26 22:43:02

+0

對!讓我努力在其他方面獲得這個f。 – Iter 2013-04-27 02:30:27

+0

@ildjarn大聲笑,好電話 – mydogisbox 2013-04-27 03:02:19