//方法一 尾递归的优化
//构建一个带尾递归的函数。因为它会返回自身调用的结果,所以它是尾递归
//JavaScript 当前没有对这种形式的递归做出优化
var factorial = function factorial(i, a) {
console.log(i, a);
a = a || 1;
console.log(i, a);
if (i < 2) {
return a;
}
// return factorial(i-1,a*i);
return factorial(i - 1, a * i);
};
console.log("这是上面4的阶乘:", factorial(4));
//方法二:另一种形式 复杂度为O(1)
function factorial(n, total) {
if (n === 1) return total
return factorial(n - 1, n * factorial)
}
factorial(5, 1)
//方法三
// 用arguments.callee可以不用管函数名变还是不变都可以用
function fac(num) {
if (num <= 1) {
return 1;
} else {
// 闭包
return num * fac(--num); //方法一
//return num*fac(num-1); //方法二
// return num*arguments.callee(num-1);//方法三
// return num*arguments.callee(--num);//方法四
/*但在严格模式下不能通过脚本访问arguments.callee*/
}
}
var result = fac(4);
console.log("这是下面4的阶乘:", result);
//方法四
var factorial = function fac(num) {
if (num <= 1) {
return 1;
} else {
// 闭包
return num * fac(num - 1);
}
}
var result = factorial(4);
console.log("这是最后下面4的阶乘:", result);
//方法五
function fac(n) {
return n > 1 ? n * fac(n - 1) : 1
}
console.log('结果为:', fac(5))
//方法六
function test1(num) {
for (var i = num - 1; i >= 1; i--) {
num *= i;
}
return num;
}
console.log("for循环递归", test1(5));
// 方法七 while循环
function test2(num) {
var result = num;
while (num > 1) {
num--;
result *= num;
}
return result;
}
console.log("while循环递归", test2(4));
//方法八
function factorial(n) {
if (n === 1) return 1
return n * factorial(n - 1)
}
factorial(5)