<script>
function calc(n){
alert("n="+n);
if(n>0)
return(calc(n-1)*n);
return(1);
}
document.write("正整数6的阶乘是"+calc(6));
</script>--------------------------------------
代码中为什么要有return(1)?它的作用是什么?
如果去掉return(1)则显示: 正整数6的阶乘是NaN?我是新手,能说详细些吗?谢谢!
function calc(n){
alert("n="+n);
if(n>0)
return(calc(n-1)*n);
return(1);
}
document.write("正整数6的阶乘是"+calc(6));
</script>--------------------------------------
代码中为什么要有return(1)?它的作用是什么?
如果去掉return(1)则显示: 正整数6的阶乘是NaN?我是新手,能说详细些吗?谢谢!
alert("n="+n);
if(n>0)
return(calc(n-1)*n);
return(1);
}等同于function calc(n){
alert("n="+n);
if(n>0) {
return(calc(n-1)*n);
}
return(1);
}继续等同function calc(n){
alert("n="+n);
if(n>0) {
return calc(n-1)*n;
}
return 1;
}
return(6*5*4*3*2*1)
当 n<=0 时
return(1)-----------------
但程序在运算过程中也执行了 n=0;
为什么最终输出结果是 720 而不是 1呢?
当n=6时程序是这样执行的吧
calc(5)*6
calc(4)*5*6
calc(3)*4*5*6
calc(2)*3*4*5*6
calc(1)*2*3*4*5*6
calc(0)*1*2*3*4*5*6
当执行calc(0)时程序就不会执行n>0里面的语句了,它就会执行 return(1)这句,如果这句不写程度返回的就是
NaN*1*2*3*4*5*6=NaN,如果改成 return 2 则结果是 2*1*2*3*4*5*6=1440
例如输入5
代码会这样执行calc(n-5)*calc(n-4)*calc(n-3)*calc(n-2)*calc(n-1)*5当执行n-5的时候为0,如果不return 1的话,calc(n-5)就返回undefined,undefined和其他数值相乘都返回NaN,所以要return 1
其实这里多了一步计算了,应该改成
function calc(n){
if(n>1) {
return calc(n-1)*n;
}
return n;
}
我的压缩包里面不止一两样东西哦,那可是我学习和工作的所有资料,不管是学习还是工作都会需要。
http://download.csdn.net/user/yangtonghai
if(n>0){
return(calc(n-1)*n);
}else{
return(1);
}
}
document.write("正整数6的阶乘是"+calc(6));
加上大括号比较好理解一点,这是一个函数递归的用法,如果没有return(1),刚当n=0的时候,calc(0)没有返回值,即返回值为undefined,任何数乘以undefined都为NaN。写个比较直观的吧,与上面等价function calc(n){
var result;
if(n>0){
result = calc(n-1) * n;
}else{
result = 1;
}
return result;
}
document.write("正整数6的阶乘是"+calc(6));
if(n>1) {
return calc(n-1)*n;
}
return n;
}
如果 n<=0的话 他的结果也是 0或都负数,跟上面的return(1) 结果不一样呀!
典型的递归求阶乘是个非常简单的逻辑,没必要用递归,递归不是用在这种非常简单逻辑上循环就够了,递归调用时会进栈出栈,函数切换时性能消耗反而更大,循环是最佳选择。递归一般用在循环无法做到的地方,如遍历树节点。阶乘算法实在是不应该用递归。至于return (1) 和 return 1一样,括号可以省略。return 1的目的是阶乘的终点,即从n开始,一直向下相乘n*(n-1) ...,阶乘的终点刚好是1,所以最后直接返回1作为结束递归。写这个例子的人,实在是个人觉得写例子的人是在显摆自己会递归,却不知递归的负面影响,一句: if (n > 0) 暴露了他的幼稚
js没尾递归是致命伤