【发布时间】:2013-04-27 02:15:53
【问题描述】:
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
【问题讨论】:
-
试图在这里建立代表。为什么投反对票?
标签: recursion f# stack-overflow
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
【问题讨论】:
标签: recursion f# stack-overflow
您的 p = fun x -> x = 1 当然会检查 x 是否为 1。
您的递归调用在n 上使用p,否则递减n。
这将导致 n 变得越来越负,导致无限递归,因为 n 永远不会是 1。要解决此问题,您无需调用 p 的值小于 1 的 n 或更改您的检查除了检查值 1 之外的功能。
不妨试试let a, p, n = 3, ( fun x -> x <= 1 ), 4。
【讨论】:
f 被设为尾递归,那么代码将按原样使用 p “工作”(即不会崩溃),因为 n 最终会下溢并且从Int32.Max倒数到1。