JavaScript阶乘、递归、冒泡

256 阅读1分钟

一、阶乘

<!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>

求一组数中的最大数

求一组数的最小数

选择法排序