我一直在学习ML中的函数式编程,因为我得到了一段时间 注重递归和尾递归。 几乎(而不是每一个)循环我用其他语言编写我写的尾递归函数。 我应该继续这样做,还是会混淆我未来的同龄人或者每个人?
答案 0 :(得分:3)
Tail recursive calls是在ML(或Ocaml)语言(或者Scheme,甚至是大多数Common Lisp中)编码“循环”的正确方法,但遗憾的是不在具有迭代结构的MELT中3} p>
看看,例如以标准库的源代码为例(例如Ocaml的stdlib)。
尾巴召唤呼叫不会让你的同伴感到困惑,他们对此很熟悉。
顺便说一下,你也可以感觉到程序语言中的普通循环(例如C或Java或C ++)是非常隐藏的尾递归调用。这是一个意见问题。 BTW,在Ocaml中,我通常将fooloop
命名为(用有意义的名称替换foo
,例如findloop
或scanloop
...)内部尾递归函数。 ..
当然,在Ocaml中使用尾递归内部函数更具惯用性,例如:使用while
构造...
查看尾递归调用的另一种方法是它们实际上是“带参数的getos”(并且通常实现为机器跳转指令,并在机器寄存器中传递一些值)。