php递归、尾递归计算阶乘

c语言有尾递归之说,可以立即释放内存,效率也比递归要高。

之前使用php做了测试,测试结果显示尾递归在php中并没有效果。

$t1 = microtime(true); //时间点1
$m1 = memory_get_usage();
//递归
function a($n,$t=1){
    if ($n>1) {
        $t = a($n-1,$t*$n);
    }
    return $t;
}
//尾递归
function b($n,$t=1){
    if ($n<=1) {
        return $t;
    }else {
        return b($n-1,$t*$n);
    }
}
//增加计算量
function _set($n=1,$x=10){
    for ($i=0;$i<$x;$i++){
        if ($n==1) {
            $a = a(170);
        }else{
            $a = b(170);
        } 
    }
}


//_set(1,400000); //调用递归
_set(2,400000); //调用尾递归


$t2 = microtime(true);
$m2 = memory_get_usage();


function convert($size){
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

echo "用时(毫秒):".ceil(($t2-$t1)*pow(10,3));
echo "<hr>";
echo "m2=".$m2.";<br>m1=".$m1.";<br>内存使用:".convert($m2-$m1);


递归测试结果

用时(毫秒):34922

m2=332104;
m1=331944;
内存使用:160 b



尾递归测试结果

用时(毫秒):33948

m2=332104;
m1=331944;
内存使用:160 b


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值