javascript递归学习方法与相关题目
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)