Recursion 带递归函数的Stackoverflow
当n你的Recursion 带递归函数的Stackoverflow,recursion,f#,stack-overflow,Recursion,F#,Stack Overflow,当n你的p=funx->x=1时获得堆栈溢出,当然,这会检查x是否为1 递归调用在n上使用p,否则递减n 这将导致n变得越来越负,导致无限递归,因为n永远不会是1。要解决此问题,您不需要使用n小于1的值调用p,也不需要更改检查函数来执行检查值1以外的操作 也许试着让a,p,n=3,(funx->x你的p=funx->x=1,当然,它会检查x是否为1 递归调用在n上使用p,否则递减n 这将导致n变得越来越负,导致无限递归,因为n永远不会是1。要解决这个问题,您不需要使用n小于1的值调用p,或者更改
p
=funx->x=1
时获得堆栈溢出,当然,这会检查x
是否为1
递归调用在n
上使用p
,否则递减n
这将导致n变得越来越负,导致无限递归,因为n永远不会是1。要解决此问题,您不需要使用n
小于1的值调用p
,也不需要更改检查函数来执行检查值1以外的操作
也许试着让a,p,n=3,(funx->x你的
p
=funx->x=1
,当然,它会检查x
是否为1
递归调用在n
上使用p
,否则递减n
这将导致n变得越来越负,导致无限递归,因为n永远不会是1。要解决这个问题,您不需要使用n
小于1的值调用p
,或者更改您的检查函数来执行检查值1以外的操作
也许试着
让a,p,n=3,(有趣的是x->x试图在这里构建rep。为什么否决投票?为什么否决投票?同样值得注意的是,如果f
是尾部递归的,那么代码将“工作”(即不崩溃)使用p
原样,asn
最终会下溢,并从Int32.Max
倒计时到1
。同样值得注意的是,如果f
是尾部递归的,那么代码将“工作”(即不会崩溃)使用p
as is,asn
最终将下溢并从Int32.Max
倒计时到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