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