Recursion 带递归函数的Stackoverflow

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,或者更改

当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
,或者更改您的检查函数来执行检查值1以外的操作


也许试着
让a,p,n=3,(有趣的是x->x试图在这里构建rep。为什么否决投票?为什么否决投票?同样值得注意的是,如果
f
是尾部递归的,那么代码将“工作”(即不崩溃)使用
p
原样,as
n
最终会下溢,并从
Int32.Max
倒计时到
1
。同样值得注意的是,如果
f
是尾部递归的,那么代码将“工作”(即不会崩溃)使用
p
as is,as
n
最终将下溢并从
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