堆栈溢出为大输入

时间:2015-05-14 19:15:54

标签: stack overflow ocaml stack-overflow ml

所以这是我的计划的一部分。当我调用绑定的差异超过250000的数字时,它会导致堆栈溢出..我该如何解决这个问题?该程序适用于较小的输入..我很确定程序的其余部分没问题。有没有办法重写功能,以便它们工作?我宁愿不用于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);;

1 个答案:

答案 0 :(得分:4)

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

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

我不想为你编写代码(因为这看起来像是一个赋值)。但是,制作尾递归函数的常用方法是将累积结果作为额外参数传递。