JavaScript求阶乘的八种方法

//方法一 尾递归的优化

//构建一个带尾递归的函数。因为它会返回自身调用的结果,所以它是尾递归 
//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)

猜你喜欢

转载自blog.csdn.net/qq_42526440/article/details/113935569