-module(demo).
-export([factorial/1]).
factorial(0) -> 1;
factorial(N) ->
N * factorial(N-1).
阶乘不是尾递归,但为什么它不会溢出堆栈?我能够在没有堆栈溢出的情况下获得 100,000 的阶乘,但需要一些时间来计算。
Erlang进程的“堆栈”不是存储在系统给进程的堆栈中(通常是几兆字节),而是存储在堆中。据我所知,它会无限增长,直到系统拒绝为虚拟机提供更多内存。
大小包括 233 个字的堆区域 (其中包括堆栈)。垃圾收集器根据需要增加堆。
进程的主(外)循环必须是尾递归的。否则,堆栈将不断增长,直到进程终止。
Source
如果您在进程监视器(例如 OSX 上的活动监视器)中监视 Erlang VM 进程,或者top
在其他类UNIX系统上,你会看到内存使用量会不断增加,直到计算完成,此时一部分内存(存储“堆栈”的内存)将被释放(这种情况会发生)在函数为我返回后几秒钟逐渐)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)