尾递归浅谈

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>

  

转载于:https://www.cnblogs.com/tudas/archive/2012/11/08/tail-recursive.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值