-module(demo).
-export([factorial/1]).
factorial(0) -> 1;
factorial(N) ->
N * factorial(N-1).
阶乘不是尾递归,但为什么它不会溢出堆栈?我能够在没有堆栈溢出的情况下得到100,000因子,但需要一些时间来计算。
答案 0 :(得分:7)
Erlang进程的“堆栈”不存储在系统给进程的堆栈中(通常是几兆字节),而是存储在堆中。据我所知,在系统拒绝为VM提供更多内存之前,它将无限增长。
大小包括堆区域的233个单词(包括堆栈)。垃圾收集器根据需要增加堆。
进程的主(外部)循环必须是尾递归的。否则,堆栈会一直增长,直到进程终止。
如果您在OSX上的活动监视器或其他类UNIX系统上的top
等进程监视器中监视Erlang VM进程,您将看到在计算完成之前内存使用量将继续增加,此时内存的一部分(存储“堆栈”的那一部分)将被释放(这在函数返回后的几秒内会逐渐发生)。