尾递归浅谈

erlang:

bump(L) -> bump_acc(L, []).
bump_acc([], Acc) -> reverse(Acc);
bump_acc([H|T], Acc) -> bump_acc(T, [H+1|Acc]).
 
reverse(L) -> reverse_acc(L, []).
reverse_acc([], Acc) -> Acc;
reverse_acc([H|T], Acc) -> reverse_acc(T, [H|Acc]).

c#:

public static int FactorialRecursively(int n)
{
    return FactorialContinuation(n-1, r => n*r);
}
 
public static int FactorialContinuation(int n, Func<int, int> continuation)
{
    if(n == 0) return continuation(1);
    return FactorialContinuation(n-1, r => continuation(n*r));
}
 
//calc !10
FactorialContinuation(10, x => x);

推演:

FactorialRecursively(3)
-> FactorialContinuation(2, r => 3*r);
-> FactorialContinuation(1, r => 3*2*r);
-> FactorialContinuation(0, r => 3*2*1*r);
-> 3*2*1

javascript:

<html>
<script type="text/javascript">
    function factorialRecursively(n)
    {
        var func = function(r)
        {
            return n * r;
        }
        return factorialContinuation(n-1, func)
    }
 
    function factorialContinuation(n, func)
    {
        if(n == 0)  return func(1);
 
        var con = function(r)
        {
            return func(n*r);
        }
        return factorialContinuation(n-1, con)
    }
 
    var func = function(x)
    {
        return x;
    }
 
    var test0 = factorialRecursively(5);
    document.write("test0 val:" + test0);
 
    document.write("<br/>");
 
    var test = factorialContinuation(5, func)
    document.write("test val:" + test);
</script>
</html>

  

posted @   caochao88  阅读(313)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示