Jef*_*eff 0 language-agnostic recursion functional-programming tail-recursion
除典型之外,还有哪些其他与语言无关的设计递归函数的方法:
if (counter < 1)
return output;
else
callSelf();
Run Code Online (Sandbox Code Playgroud)
还有其他方法吗?每当查看示例时,我总会看到上面代码的一个版本.
谢谢!:)
这就是它.
递归函数设计就像"我可以返回一个值还是需要进一步处理?"一样简单.并且"Processing返回了一个值,在我传递之前我该怎么做?"
尾递归只是编译器/解释器可用于提高性能的优化方法.本质上,如果递归函数遵循严格格式(在递归调用之后没有任何反应,通常意味着递归调用总是与之配对return),可以优化递归函数并将其重写为for循环.
你究竟是什么问题?只是尝试一些答案;-)
有许多类型的递归:
"标准"递归
let rec sum = function
| [] -> 0
| x::x' -> x + sum x'
Run Code Online (Sandbox Code Playgroud)尾递归
let rec sum acc = function
| [] -> acc
| x::x' -> sum (x + acc) x'
Run Code Online (Sandbox Code Playgroud)相互递归
let rec f() = g()
and g() = f()
Run Code Online (Sandbox Code Playgroud)定点递归
let factorial n = fix(fun rec n -> if n < 1 then 1 else n * rec (n - 1)) n
Run Code Online (Sandbox Code Playgroud)递归的应用程序列表非常丰富.在函数式编程中,任何迭代代码(for-loops等)都通过递归表示!
另一个好例子:
let rec sumTree = function
| End -> 0
| Node(val, right, left) = val + sumTree right + sumTree left
Run Code Online (Sandbox Code Playgroud)
递归的主要"最佳实践"是确保在某些时候满足您的终止条件,因此您通常会使用比初始调用中更小的数据自我调用函数(只是树的一部分) ).其他一切都可以导致无休止的递归.