javascript递归学习方法与相关题目

作者: Darren 分类: javascript 发布时间: 2019-06-13 16:24

1、封装一个函数 解决单次问题
2、在当前函数内部调用自己
3、检查并设置递归出口

题目:

用递归制作5层嵌套div并 长宽逐渐减少一半

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        //用递归制作5层嵌套div并 长宽逐渐减少一半

        //1、封装一个函数解决单次问题 制作一个div
            //@param1 pdom obj 父元素dom对象
            //@param2 width num div宽度
            //@param3 height num div高度
        // function cdiv(pdom,width,height){
        //     //创建新元素
        //     var div = document.createElement('div')

        //     div.style.width = width+'px'
        //     div.style.height = height+'px'
        //     div.style.border="1px solid red"

        //     //追加操作
        //     pdom.appendChild(div)
        // }

        //2、在函数内部调用函数自己 调整问题规模
        // function cdiv(pdom,width,height){
        //     //创建新元素
        //     var div = document.createElement('div')

        //     div.style.width = width+'px'
        //     div.style.height = height+'px'
        //     div.style.border="1px solid red"

        //     //追加操作
        //     pdom.appendChild(div)

        //     //递归入口
        //     cdiv(div,width/2,height/2)
        // }

        //3、检查并设置递归出口
            //@param4 level num div嵌套层级
        function cdiv(pdom,width,height,level){
            //创建新元素
            var div = document.createElement('div')

            div.style.width = width+'px'
            div.style.height = height+'px'
            div.style.border="1px solid red"

            //追加操作
            pdom.appendChild(div)

            //level 为5

            //添加了5个div后就不再做了
            //递归出口
            if(level<5){
                //递归入口
                cdiv(div,width/2,height/2,level+1)
            }
        }

        window.onload=function(){ 
            cdiv(document.body,1000,1000,1)
        }
    </script>
</head>
<body>
    
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        //用递归输出1~10

        //递归的业务特征: 问题规模可以拆分 不论规模大小解决方式都一样
        //递归的代码特性: 在函数的内部调用当前函数本身(自己调用自己)

        //1、先封装一个函数 用于解决单次问题
        //封装一个函数 输出一个数
        // function count(num){
        //     console.log(num)
        // }

        //2、在函数内部调用函数自己 并调整问题的规模
        // function count(num){
        //     console.log(num)
        //     //递归入口 调整问题规模
        //     count(num+1)
        // }

        //3、设置递归出口 递归能不能停下来
        function count(num){
            console.log(num)
            //设置递归出口
            if(num<10){
                //递归入口 调整问题规模
                count(num+1)
            }
        }

        count(1)
    </script>
</head>
<body>
    
</body>
</html>

换瓶盖

小明带来了30个瓶盖

他能喝到几瓶可乐?

方法1:尽可能多换
10瓶可乐 ->10个瓶盖
3瓶可乐 1个瓶盖 -> 4个瓶盖
1瓶可乐 1个瓶盖 -> 2个瓶盖

//瓶盖数
var pg = 30
//喝到的可乐数量
var kl = 0

//封装一个函数解决单次问题
function exchange(){
    //用瓶盖数除以3 向下取整 本次换得的可乐数量
    var getKl = Math.floor(pg/3)

    //剩余几个瓶盖
    pg -= getKl*3

    //把换到的可乐喝掉
    kl += getKl

    //得到瓶盖
    pg += getKl
    
    //剩余的瓶盖数量是否大于等于3
    if(pg>=3){
        //继续换
        exchange()
    }
}

exchange()
//查看剩余瓶盖
console.log(pg)
//查看喝到几瓶可乐
console.log(kl)

 

方法2:一次换一瓶
每次换购 减少3个瓶盖 得到1瓶可乐 增加1个瓶盖

用递归输出1~10

//瓶盖数
var pg = 30
//喝到的可乐数量
var kl = 0

//封装一个函数解决单次问题
function exchange(){
    //瓶盖减少3个
    pg-=3

    //喝到的可乐数量加1
    kl+=1

    //瓶盖增加1个
    pg+=1

    if(pg>=3){
        //继续换
        exchange()
    }
}

exchange()
//查看剩余瓶盖
console.log(pg)
//查看喝到几瓶可乐
console.log(kl)

珠穆娜玛峰:

折纸:折多少次和珠穆朗玛峰一样高
1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米

var zms = 8848;
var ks = 0.0001
var js = 0;
var gao = 0.0001

function dks (){
    gao*=2

    js+=1
    if(gao<=8848){
        dks()
    }
}
dks()
console.log(js)
console.log(gao)

 

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注