大输入的堆栈溢出

0 stack-overflow stack ocaml ml overflow

所以这是我计划的一部分。当我为差值超过 250000 的数字调用 bound 时,它会导致堆栈溢出.. 我该如何解决这个问题?该程序适用于较小的输入。我很确定程序的其余部分都很好。有没有办法重写函数以便它们工作?我宁愿不使用 for while 循环。谢谢

let rec sqdigits a =
if a = 0 then 0
else ( a mod 10)*( a mod 10) + sqdigits (a/10);;

let rec bound c d =
if c>d then []
else (sqdigits (c))::(bound (c+1) d);;
Run Code Online (Sandbox Code Playgroud)

Jef*_*eld 5

你的函数不是尾递归的。您不需要消除递归(消灭函数式编程语言中的思想!)。你只需要让它们尾递归。

实际上,递归调用sqdigits的次数受 int 中位数的限制,这是一个非常小的数字。所以你真的只需要修复bound

我不想为您编写代码(因为这看起来像是一项任务)。但是制作尾递归函数的通常方法是将累积结果作为额外参数传递。