我了解关于递归的一般认知 - 不要使用它,因为它不是良好的内存管理实践。但是,除非编程语言在递归下处理内存管理真的很好,否则这个概念应该被应用到所有的编程语言中。
在浏览Educative Rust课程的文档时,有一个声明:
Rust可以进行递归,但并不是真正鼓励使用。相反,Rust更喜欢一种叫做迭代的东西,也就是循环。
我无法理解这是为什么?与其他语言相比,Rust是否存在一些不太常见的东西,导致不建议使用递归或者迭代在Rust中比其他语言中处理得更好?
我了解关于递归的一般认知 - 不要使用它,因为它不是良好的内存管理实践。但是,除非编程语言在递归下处理内存管理真的很好,否则这个概念应该被应用到所有的编程语言中。
在浏览Educative Rust课程的文档时,有一个声明:
Rust可以进行递归,但并不是真正鼓励使用。相反,Rust更喜欢一种叫做迭代的东西,也就是循环。
我无法理解这是为什么?与其他语言相比,Rust是否存在一些不太常见的东西,导致不建议使用递归或者迭代在Rust中比其他语言中处理得更好?
for
或while
循环)。
最后,在回答中,我特别谈到了尾调用消除(TCE)。你可能听说过尾调用优化(TCO),Rust具有此功能,因为其后端是LLVM,具有TCO。
TCO的问题在于,优化意味着启发式和一定的机会性:编译器可能会根据调用类型、函数大小、参数数量(和大小)、控制流等来优化递归,也可能不会这样做,并且优化甚至可能没有在所有后端上实现。这意味着如果你要使语言在没有迭代结构的情况下工作,TCO不能成为语言语义的基础,你需要在出现时可靠地删除尾调用。因此,你需要尾调用消除而不是仅仅是优化。
for
和while
循环。 这是一个单行的for
循环示例:for i = 0 to 3 do printf "i = %d\n" i done;;
。 - Austin Davis