2013-04-26 76 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