1. 程式人生 > >js中實現階乘(多種方法)以及階乘求

js中實現階乘(多種方法)以及階乘求

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>階乘五種計算方法</title>
<script type="text/javascript">
/*use strict*/
/* 方法一 尾遞迴的優化*/
//構建一個帶尾遞迴的函式。因為它會返回自身呼叫的結果,所以它是尾遞迴
//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));

/*方法二*/
// 用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(4));
// ECAMscript不存在塊級作用域在迴圈內部定義的變數也可以在外部訪問
// JS 確實有函式作用域【但不存在塊級作用域】。那就意味著定義在函式中的引數和變數在函式外部是不可見的。而在一個函式內部任何位置定義的變數,在該函式的內部任何地方都可見。


//方法五 for迴圈 (使用迴圈語句)
function test1(num){
for(var i=num-1;i>=1;i--){
num *=i;
}
return num;
}
console.log("for迴圈遞迴",test1(5));

// 方法六 white迴圈
function test2(num){
var result = num;
while(num>1){
num--;
result *=num;
}
return result;
}

console.log("while迴圈遞迴",test2(4));

//5的階乘求和

function test3(num){

var n=num;

var total = 0;

for(var i=1;i<=n;i++){

var temp = 1;

for(var j=i;j>=1;j--){

temp *=j;

}

total += temp;

}

return total;

}

console.log("5的階乘總和為",test3(5))

/* label 標識
使用label可以在程式碼中新增標籤,以便將來使用
label : for(int i=0;i<10;i++){
if(i == 5){
break label;
}
}
    迴圈關鍵字
       break 跳出迴圈體
       continue 結束本次迴圈,進行下一次迴圈*/
</script>
</head>
<body>

</body>
</html>