一、阶乘
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>求阶乘和</title>
</head>
<body>
<input id="num" type="text" />
<input type="button" value=" 求阶乘和 " onclick="testf()" />
<input id="result" type="text" />
</body>
</html>
<script type="text/javascript">
//1+2+3+4+5
//1*2*3*4*5
function testf(){
var num = parseInt(document.getElementById("num").value);
// var sum = 0;
// for(var i=1;i<=num;i++){
// //1、求i的阶乘
// var jie = 1;
// for(var j=1;j<=i;j++){
// jie = jie*j;
// }
// //2、求和
// sum = sum + jie;
// }
/*
1!=1;
2!=2*1!;
3!=3*2*1 = 3*2!;
4!=4*3*2*1 = 4*3!
5!=5*4*3*2*1 = 5*4!
*/
var jie = 1;
var sum = 0;
for(var i=1;i<=num;i++){
//1、求i的阶乘
jie = i*jie;//1 2 6
//2、求和
sum = sum + jie;
}
document.getElementById("result").value = sum;
}
</script>
二、递归
JS函数可以相互调用,嵌套调用
JS函数也能调用自己,调用自己的函数叫做递归函数,递归函数就是特殊的嵌套调用函数。
递归就是函数自己调用自己,函数的递归调用是特殊的嵌套调用。
注:在递归内部,必须要有一个分支是不调用自己的。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>递归</title>
</head>
<body>
<button onclick="fun()">测试</button>
</body>
</html>
<script type="text/javascript">
function fun(){
fun1();
}
function fun1(){
console.log("fun1开始");
fun2();
console.log("fun1结束")
}
function fun2(){
console.log("fun2开始");
fun3();
console.log("fun2结束")
}
function fun3(){
console.log("fun3开始");
console.log("fun3结束")
}
</script>
案例:
1、使用递归做一个阶乘(求n的阶乘):
<script>
/*
0!=1;
1!=1;
2!=2*1;= 2*1!;
3!=3*2*1; =3*2!;
4!=4*3*2*1; = 4*3!;
5!=5*4*3*2*1; = 5*4!; //代表5的阶乘就是 5 乘以 4 的阶乘
n! = n*(n-1)!;
*/
function factorial(n){
if(n==0 || n==1){
return 1;
}
return n*factorial(n-1); //n*(n-1)的阶乘
}
function fun(){
var num = factorial(3);
console.log(num);
}
fun();
</script>
2、斐波那契数列(求第n个斐波那契数列 的数字)
1)递归的写法 注:递归的效率低,他一直在调用自己,不好跟踪。
<script type="text/javascript">
/*
斐波那契数列:前两个数是1,从第三个数开始,每个数是前两个数之和
1 1 2 3 5 8 13 21 ...
*/
//求第n个斐波那契数列 的数字
function fun(n){
if(n <= 2){
return 1;
}
//前两个相加 就是第三个
return fun(n-1)+fun(n-2);
}
console.log(fun(4));
</script>
2)使用循环
<script type="text/javascript">
/*
斐波那契数列:前两个数是1,从第三个数开始,每个数是前两个数之和
1 1 2 3 5 8 13 21 ...
*/
//求第n个斐波那契数列 的数字
function fun(n){
if(n <= 2){
return 1
}
let num1 = 1;
let num2 = 1;
let num3;
for (let i = 3;i <= n;i++){
num3 = num1 + num2;
//在下面 给赋值,让每次都是 num1 + num2
num1 = num2;
num2 = num3;
}
return num3
}
console.log(fun(4));
</script>
三、冒泡
<script>
/*
冒泡:相邻两个数进行比较,若前一个数大于后一个数,则交互两个数的位置,以此类推。
// 9, 8, 3, 7, 6
第一轮
i=0;
比较4次
j= 0 1 2
9 8 8 8 8
8 9 3 3 3
3 3 9 7 7
7 7 7 9 6
6 6 6 6 9
arr[0]>arr[1] arr[1]>arr[2] arr[2]>arr[3]
arr[j]>arr[j+1]
第二轮
i=1
比较3次
j = 0 1 2
8 3 3 3
3 8 7 7
7 7 8 6
6 6 6 8
i=2;
比较 2次
3 3 3
7 7 6
6 6 7
i=3;
3 3
6 6
*/
function testf(){
var arr=[9, 8, 3, 7, 6];
for(var i=0;i<arr.length-1;i++){ //i=0 1
for(var j=0;j<4-i;j++){
if(arr[j]>arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
console.log(arr);
}
</script>