今日学习任务
[ ] 01-案例:动态生成柱状图
[ ] 02-能够使用循环结构数组遍历应用
[ ] a.数组遍历输出
- b.反转数组
- c.嵌套循环遍历
[ ] 03-函数
[ ] a.掌握函数的基础语法
- b.理解函数的实际应用
- c.掌握函数的形参、实参和返回值的作用
- d.掌握js的外联引入方式
01-循环结构应用场景练习
1.1-动态生成柱状图
- 允许用户输入要生成的柱状图数量
- 随机生成柱状图的每个柱子的高度(实际开发从后台获取)
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}/* 父盒子 */.box {/* 子盒子要绝对定位,父盒子相对定位 */position: relative;margin: 100px auto;width: 1200px;height: 200px;border: 1px solid skyblue;}/* 子盒子 */.dis {position: absolute;text-align: center;}</style></head><body><script>/*动态生成用人输入数量的柱状图思路分析1.设计div包括和显示柱子1.1.柱子包含在大的div中:box1.2.柱子要平铺在box中,对小柱子(内部div)定位2.获取用户输入的柱子数量3.为了让柱子之间有间隔,也让柱子不挨着两边:计算柱子的间距(空白柱子分隔)3.1.计算柱子数量:图形柱子 + 空白柱子3.2.计算柱子宽度:铺满整个空间4.动态生成柱形图4.1.空白柱子高度填满父盒子,背景透明4.2.数据柱子颜色随机,高度随机5.输出柱形图*///2.获取用户输入的柱子数量let num = +prompt('请输入柱形图数量:');//3.为了让柱子之间有间隔,也让柱子不挨着两边:计算柱子的间距(空白柱子分隔)//3.1.计算柱子数量:图形柱子 + 空白柱子let picNum = num * 2 + 1;//3.2.计算柱子宽度:铺满整个空间let divWidth = 1200 / picNum;//4.动态生成柱形图let divs = '<div class="box">';//循环要生成的柱子数量for (let i = 0; i < picNum; i++) {//计算每个柱子的偏移量:绝对定位的left距离let left = divWidth * i;// 偶数为透明柱子,奇数为图形柱子if (i % 2 == 0) {//4.1.空白柱子高度填满父盒子,背景透明divs += `<div class="dis" style="width:${divWidth}px;height:200px;background-color:transparent;left:${left}px;top:0"></div>`;} else {//4.2.数据柱子颜色随机,高度随机//随机产生高度let divHeight = Math.ceil(Math.random() * 200);//随机产生颜色let red = green = blue = 0;//按照柱子的高度来分配颜色:高度低于60,深色区间80;高度大于60 小于120,中色区间80 - 160,高度大于120,浅色区间160-240if (divHeight < 60) {//深色区间:80red = Math.random() * 80;green = Math.random() * 80;blue = Math.random() * 80;} else if (divHeight < 120) {//中色区间80-160red = Math.random() * 80 + 80;green = Math.random() * 80 + 80;blue = Math.random() * 80 + 80;} else {//浅色区间160-240red = Math.random() * 80 + 160;green = Math.random() * 80 + 160;blue = Math.random() * 80 + 160;}//将产生的柱子div绑定到父盒子内部//需要对每个柱子增加宽度divWidth,盒子高度divHeight,颜色rgb,偏移量leftdivs += `<div class="dis" style="width:${divWidth}px;height:${divHeight}px;background-color:rgb(${red},${green},${blue});left:${left}px;"></div>`;/*正常柱状图应该是下面平行,上面显示锯齿,怎么实现?锯齿的Y轴偏移量top*/}}//拼凑完整父盒子divs += '</div>';//5.输出柱形图document.write(divs);</script></body></html>
02-数组练习
1.1-数组练习1
<!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></head><body><script>/*1.求数组中元素的平均值2.求数组中元素的最大值3.求数组中元素的最小值4.将1-100中3的倍数放入数组中*///1.求数组中元素的平均值let arr = [98,59,99,60,100];//(1)声明空箩筐let sum = 0;//(2)遍历萝卜堆数for(let i = 0;i<arr.length;i++){//(3)添加到箩筐sum += arr[i];};console.log(sum / arr.length);//2.求数组中元素的最大值let arr = [98,59,99,60,100];//(1)声明空擂主let max = -Infinity;//(2)遍历挑战者for(let i = 0;i<arr.length;i++){//(3)挑战者依次和擂主PKif(arr[i] > max){max = arr[i];};};console.log(max);//3.求数组中元素的最小值//4.将1-100中3的倍数放入数组中//思路:遍历指定范围符合条件的数let arr = [];for(let i = 1;i<=100;i++){if(i%3==0){arr[arr.length] = i;};};console.log(arr);</script></body></html>
1.2-数组练习2(翻转数组)
<!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></head><body><script>/*1.翻转数组*///1.翻转数组let arr = [20, 25, 66, 88, 90];//[90,88,66,25,20]/*1.1 翻转法(1)声明空数组newArr(2)倒着遍历arr,添加到空数组中*/// //1.声明空数组newArr// let newArr = [];// //2.倒着遍历arr,添加到空数组中// for(let i = arr.length-1;i>=0;i--){// console.log(arr[i]);// newArr[newArr.length] = arr[i];// };// console.log(newArr);/*1.2 交换法(1)遍历数组一半(2)下标为 i元素 与 下标为 arr.length-1-i 元素交换*///1.遍历数组的一半for (let i = 0; i < arr.length / 2; i++) {//i = 0 1 2//2. 下标为i元素 和 下标为arr.length-1-i元素交换let temp = arr[i];arr[i] = arr[arr.length - 1 - i];arr[arr.length - 1 - i] = temp;};console.log(arr);</script></body></html>
1.3-数组练习3(实际应用场景)
- 需求:根据数组将数据加工输出到页面上
<!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></head><body><script>/** 1.目前阶段的学习中,我们仅能做一些静态网页,也就是说所有的数据都是写死的* 2.实际开发中,我们通常会使用js代码从服务器请求数据加载到网页中,而这些数据通常都是数组* 3.本小节我们来学习如何根据数组的内容来产生网页的结构*///1.请求服务器,得到一个数组的数据let books = ["js语言很牛逼","C语言从入门到放弃", "编程之道:从程序员到卖麻辣烫", "颈椎病治疗指南", "JavaScript权威指南","js从入门到入坟"];// document.write('<ul><li>老铁666</li></ul>');document.write('<ul>');for(let i = 0;i<books.length;i++){document.write('<li>' + books[i] + '</li>');};// document.write('<li>' + books[0] + '</li>');// document.write('<li>' + books[1] + '</li>');// document.write('<li>' + books[2] + '</li>');// document.write('<li>' + books[3] + '</li>');// document.write('<li>' + books[4] + '</li>');document.write('</ul>');</script></body></html>
1.4-字符串数组访问扩展
- 在JS中,字符串的每个符号都有一个下标,默认从0开始
- 字符串数组访问只是可读,不能修改
<!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></head><body><script>/** 1.字符串的组成符号也是有下标的,而且从0开始* 2.可以利用数组下标访问的特性,通过下标访问字符串的某个符号*/let str = '我好想你';console.log(str[0],str[1],str[2],str[3]); // 我 好 想 你//无效//str[0] = 'I';/** 1.可以利用字符串特性,灵活的实现水仙花数* 2.实现步骤* * 1.将数字转换成字符串* * 2.通过字符串下标访问形式,取得每个位置上的值,然后进行求立方*/for (let i = 100; i <= 999; i++) {//类型转换,不影响i本身let str = String(i);if (Math.pow(str[0], 3) + Math.pow(str[1], 3) + Math.pow(str[2], 3) == i) {console.log(i);}}</script></body></html>
03-循环嵌套(进阶)
嵌套循环:一个循环中嵌套另一个循环
- 嵌套循环执行的总次数 = 外层循环执行次数 * 内层循环执行次数
- 嵌套执行逻辑:外部循环每执行一次,内部循环就要执行全部
1.1-循环嵌套练习:九九乘法表

<!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></head><body><script>/*第一行 i= 1 ,列数 1第二行 i= 2 ,列数 2第三行 i= 3 ,列数 3^^^i = 9 ,列数 9内层循环次数 = i*///1.外层循环 : 行 9for(let i = 1;i<=9;i++){//2.内层循环次数 = ifor(let j = 1;j<=i;j++){// i = 9 j = 1 2 3 4 5 6 7 8 9document.write(j + '*' + i + '=' + j*i + ' ');};document.write('<br><br>');};</script></body></html>
1.2-循环嵌套练习:二维数组遍历
- 二维数组:数组本身还是一个数组
二维数组遍历:先遍历外部数组,内部遍历数组元素(还是数组)
- 一般情况下:我们都是直接遍历外部(元素个数不确定),而内部通常是直接取(数据明确长度,且有规范)
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.news {width: 400px;margin: 50px auto;text-align: left;}.news li {width: 100%;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}.news a {text-decoration: none;font-size: 14px;color: #222;line-height: 20px;}.news a:hover {color: #20a1f1;}</style></head><body><script>//显示后台提供的新闻信息:news模拟后台返回的数据//新闻信息:news外部数组包含了很多条新闻//新闻信息:news元素都是数组,包含了分类、新闻标题、新闻链接let news = [['要闻', '牢记初心使命 实干笃定前行', 'https://news.ifeng.com/c/7wNelHB0SgK'],['要闻', '你以生命相托,我必全力以赴', 'https://news.ifeng.com/c/7wM1V3EzQBM'],['要闻', '中国无人战车正式服役:机枪显示惊人杀伤力', 'https://tech.ifeng.com/c/7wMT02ftUZ4'],['健康', '独家 | 武汉封城建议者:向武汉人民致敬,向援助武汉的人致敬', 'https://finance.ifeng.com/c/7wM0E6Bs8PI'],['汽车', '马斯克发飙:起诉当地政府!总部搬离加州!', 'http://auto.ifeng.com/c/7wM43afWMFs'],['汽车', '奇瑞真正的旗舰SUV,车长近5米+2.0T动力,气场不输路虎揽胜', 'https://auto.ifeng.com/c/7wIpWtWvHYv'],['房产', '广州即将推出9宗土地 涉及22.2万平米4宗宅地', 'https://gz.house.ifeng.com/news/2020_05_11-52744145_0.shtml'],];//制作字符串:包含div和ul的前半部分let newsStr = `<div class="news"><ul>`;//遍历数组:构造li内部的a标签for (let i = 0; i < news.length; i++) {//外部循环:确定出现的li数量//内部循环:确定li里面的a标签内容,但是实际上数据是规定的//news[i]就是一条具体的新闻数组:['要闻', '牢记初心使命 实干笃定前行', 'https://news.ifeng.com/c/7wNelHB0SgK']//news[i][0]是分类,news[i][1]是标题,news[i][2]是链接//所以这样是不需要进行内部循环遍历的//ES6模板字符串应用newsStr += `<li><a href="${news[i][2]}">【${news[i][0]}】${news[i][1]}</a></li>`;}// 补全标记newsStr += `</ul></div>`;//输出document.write(newsStr);</script></body></html>
04-函数
函数作用:将代码存入变量中,实现代码复用
1.1-函数介绍
- 函数是一种结构,使用function关键字声明
- 函数不会自动运行
- 函数定义后,需要主动调用才会触发
//1.声明函数:将代码存入结构中function 函数名(){函数体:一段代码}//2.调用函数:执行函数体代码函数名();
<script>/*1.函数与循环区别:本质区别a.作用不同:循环:一段代码在一个地方执行多次(主动运行)函数:一段代码在多个地方执行一次(被动运行)b.本质不同循环:只是一种语法,让代码重复执行函数:是一种数据类型,存储的是代码*//*2.什么样的代码需要使用函数a.这段代码需要在多个地方执行b.这段代码通常都是完成一个独立的小功能*//*3.语法误区:函数语法就两个(声明与调用)1.声明函数: function 函数名(){ 函数体代码 }2.调用函数: 函数名()3.变量取值: 函数名 (不会执行函数体代码,只是以字符串形式将变量中存储的东西打印出来而已)*///需求 : 一段代码 需要在多个地方执行//复制粘贴弊端 : (1)代码冗余 (2)不便于维护/*1.函数作用 : 实现某个功能代码的重复利用2.函数语法a. 声明函数 : ( *** 函数体代码不会执行 ***)function 函数名(){函数体 :一段代码};b. 调用函数 : 执行函数体代码函数名();*///(1)声明函数:打印99乘法表function getChengFa() {//定义一个变量,保存即将产生的字符串(实用,后面return讲)let chengfaStr = '';//外层循环:控制层数for (let i = 1; i <= 9; i++) {//内存循环:控制列数for (let j = 1; j <= i; j++) {//拼接内容chengfaStr += `${j} * ${i} = ${j * i}  `;}//换行chengfaStr += '<br>';}//返回结果document.write(chengfaStr);}//(2)调用函数 : 执行函数体代码getChengFa();console.log('99乘法表,我的最爱');//(3)既然这么爱,那就再来一次getChengFa();console.log('不爱了,吐了');/*3.函数注意点a.以后什么样的代码你会放入函数中?(1)多个地方执行(2)独立的小功能b.函数与循环 有着本质的区别(1)本质区别函数 :是一种数据类型,存储代码循环 :是一种语法,重复执行代码(2)作用不同函数 : 一段代码在多个地方执行一次循环 : 一段代码在一个地方执行多次*/</script>
1.2-函数参数
- 参数的目的是让函数能够变的灵活,可以完成不同的,但是功能类似的需求
函数参数分为两种:
- 形参:定义函数时的参数,属于
占座位 - 实参:调用函数时的参数,属于
实际数据
- 形参:定义函数时的参数,属于
- 函数不会自动运行:所以先
占位;调用时就是要实际运行,所以给数据
<!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></head><body><script>/*1.函数作用 : 实现某个功能代码的重复利用2.参数2.1 参数作用 : 调用者 传递数据 给函数2.2 语法传 : 调用者函数名(实参:实际参数)收 : 函数function 函数名(形参:形式参数){ 函数体代码 }2.3 函数传参的本质 : 实参给形参赋值* 实参和形参数量可以不一致,但是按照顺序赋值*/// 2.利用函数实现指定层数的乘法表/*** @description: 得到指定层数的乘法表* @param {number} level:层数* @return: 产生的字符串*/function getChengFa(level) { // level = 9//定义一个变量,保存即将产生的字符串let chengfaStr = '';//外层循环:控制层数for (let i = 1; i <= level; i++) {//内存循环:控制列数for (let j = 1; j <= i; j++) {//拼接内容chengfaStr += `${j} * ${i} = ${j * i}  `;}//换行chengfaStr += '<br>';}//返回结果document.write(chengfaStr);}//用户输入层数let level = +prompt('请输入一个要打印的乘法表的层数:');// 调用函数getChengFa(level);</script></body></html>
课后练习
写一个函数 求任意两个数字之间的和
1.3-函数返回值
- 返回值是函数运行后的结果处理方式
实际开发过程中,
不会在函数内部进行输出,都是把结果返回给调用者- 函数不对结果负责:函数只负责做,至于做出来是否合适不管
return关键字
- JS函数可以没有返回值
- 可以使用return返回任意类型数据
- return会终止函数的继续执行(结束函数运行)
<!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></head><body><script>/*1.函数作用 : 将代码存入变量中,可以实现代码的复用2.返回值2.1 返回值 : 函数 传递数据 给调用者2.2 语法传 : 函数function 函数名(形参){ return 值; }收 : 调用者let 变量名 = 函数名()*///求任意两个数字的和function getSum(a,b){let sum = a+b;console.log(sum);return sum;console.log('1111');//不会执行};//将函数调用结果显示到页面// 函数外部 无法直接 获取函数内部的变量//console.log(sum);/*函数调用工作流程 : 固定三个步骤1. 传参2. 执行函数体代码3. 返回值*/let res = getSum(100,50);console.log(res);/*函数总结1.函数几种形态无参无返回 : 使用较少无参有返回 : 使用不多有参无返回 : 使用不多有参有返回 : 使用最多2.函数完整的工作流程(原理)a. 传参 : 调用者传递数据给函数b. 执行函数体代码c. 返回值 : 函数将结果返回给调用者3.函数返回值语法注意点a. 如果函数没有写return,默认返回值是undefinedb. 如果函数有写return,但是后面没有接值。返回值是undeifinedc. 如果函数有写return,并且return后面有值。返回值就是return后面的值d. return关键字作用 : 结束函数体代码。 return后面代码不执行*/</script></body></html>
1.4-函数另一种声明方式
- 1.函数声明:
function 函数名() {}; 2.函数表达式:
let 函数名 = 匿名函数- 匿名函数:函数的字面量又称为匿名函数,顾名思义就是没有变量名的函数
let 函数名 = function(){};
- 3.两者唯一区别:函数声明可以在任何地方调用,而函数表达式方式调用必须在声明后面
<!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></head><body><script>fn1();//1.函数声明 : function 函数名(){ 函数体代码 }function fn1(){console.log('11111');};fn1();//2.表达式声明 : let 函数名 = 匿名函数//具名函数 : 有名字的函数 匿名函数 = 没名字的函数// fn2();//报错let fn2 = function(){console.log('2222');};fn2();//3.唯一区别 : 函数声明可以在任何地方调用,表达式声明只能在声明后调用</script></body></html>
课后练习1.写一个函数 求n-m之间的和2.写一个函数:求任意数组的最大值
1.5-函数练习
- 利用函数实现对应数组的最大值元素获取
<!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></head><body><script>/*函数三要素1.功能2.参数3.返回值*/// 1.写一个函数:求任意数组的最大值/*** @description: 求任意数组最大值* @param {array} arr : 数组* @return: max:最大值*/function getMax(arr) { //let arr = [88,90,100,20,66]//擂台思想let max = -Infinity;for (let i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];};};return max;};let max1 = getMax([88, 90, 100, 20, 66]);console.log(max1);//注意:函数是用来实现代码复用的,函数实现的功能越小,代码的复用性越强,所以不要尝试让一个函数去解决所有问题;而是多用几个函数去实现不同功能,然后大功能调用几个小函数实现//如:数组获取最大值,获取最小值,获取平均值应该是三个不同的函数</script></body></html>
1.6-函数实战思想
- 函数应该独立存在于js文件
- 在需要使用对应函数的html中引入js文件
/*** arr.js* @description: 求任意数组最大值* @param {array} arr : 数组* @return: max:最大值*/function getMax(arr) { //let arr = [88,90,100,20,66]//擂台思想let max = -Infinity;for (let i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];};};return max;};//可以将数组相关操作的函数封装到一个文件中,形成自己的API库
<!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 src="js/arr.js"></script></head><body><script>//直接调用引入的js文件中的函数即可let max = getMax([88, 90, 100, 20, 66]);console.log(max);</script></body></html>
1.7-封装自己的API库
- 将自己所做的内容沉淀下来,供未来使用
- 懂得根据业务进行分类
数组API封装
- 最大值
- 最小值
- 平均值
- 数组翻转
05-课后作业
课后作业
今日作业要求:函数都需要定义这js文件中,使用外联方式引入js
1.实现柱状图(从上面生长)
2.使用函数实现将数组中指定的元素去掉(★)
- function arrTrip(数组,要去除的变量)
- 例如:[0,10,20,30,0,40,0] 变成[10,20,30,40]:arrTrip([0,10,20,30,0,40,0] ,0)
3.使用函数求出数组中是否所有的数字都是正数,打印结果(★★)
- 例如:[10,20,30,40,50],打印:
true - 例如:[-10,20,30,40,50],打印:
false
- 例如:[10,20,30,40,50],打印:
4.使用函数求出任意指定数组中的最小值(★)
以下题目为循环嵌套题目(不要思维卡在数组上):使用函数完成一下作业
5.大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配?(★★★)
6.小明单位发了100元的购物卡,小明到超市买三类洗化用品,洗发水(15元),香皂(2元),牙刷(5元)。要把100元整好花掉,可如有哪些购买结合?(★★★★)
扩展题
(1) 1000~ 5000之间有多少整数,其各位数字之和为5,分别是哪些数(例如整数2003的各位数字之和为 2+0+0+3 ,等于5)),并统计满足条件的整数有多少个。(★★)
- 如果没有思路,可以查看课外拓展求水仙花数
(2)猜数字游戏. 随机产生1个1-100之间的数 让用户猜(★★)
当用户输入的数比产生的随机数大 就输出 猜大了 并让用户继续输入新的数.。 当用户输入的比产生的随机数小的时候 就输出 猜小了 并且继续猜 当用户刚好输入的就是这个随机数的时候 提示成功 并显示用户猜了多少次
- a. 先产生1-100的随机数 b. 写1个循环 让用户反复不停的去猜 直到猜对结束.
1.1-寻找水仙花数
/*** 水仙花数:是一个三位数,每一位的数字的三次方相加刚好等于自身* 例如: 153 = 1*1*1 + 5*5*5 + 3*3*3* = 1 + 125 + 27* = 153** 如何知道一个三位数的百位十位个位的数字?* 例如:235* 百位(除以一百取整): (1)235/100 = 2.35 (2)parseInt(2.35) = 2;* 十位(除以10求模):(1)235/10 = 23.5 (2)parseInt(23.5)%10 = 3;* 个位(模10): 235%10 = 5;**//*思路分析:(1)遍历所有的三位数 100-999(2)将每一位的数字三次方后相加判断是否是水仙花数(3)如果是则打印这个数,然后继续寻找(3.1)如果不是,则不打印继续寻找*/for(let i = 100;i <= 999;i++){//(1)循环所有的三位数//2.判断是否是是水仙花数let bai = parseInt(i / 100); // i/100结果是小数,通过parseInt可以取整let shi= parseInt(i / 10) % 10;let ge = parseInt(i) % 10;if(Math.pow(bai,3) + Math.pow(shi,3) + Math.pow(ge,3) == i){//(3)如果是水仙花数则打印console.log ( "找到一个水仙花数:" + i );}//3.1 继续寻找}
1.2-农场繁殖
- 农场第一年有两头牛,每两头牛每一年可以生一头小牛,小牛只需要吃草一年即可生牛,请问该农场需要多少年可以有一千头牛
/*** 农场第一年有两头牛,每两头牛每一年可以生一头小牛* 小牛只需要吃草一年即可生牛,请问该农场需要多少年可以有一千头牛* * 例如* * 第一年:两头牛 1 + 1 = 2* * 第二年: 三头牛 2 + 1 = 3(生一头)* * 第三年 :四头牛 3 + 3/2 = 4(两头牛生小牛,另一头旁边观望学习经验)* * 第四年: 六头牛 4 + 4/2 = 6(两对牛各生一头小牛)* * 总结:每一年增加的小牛数是农场总牛数除以2的倍数(取整)*///1.初始两头牛let sum = 2;//2.死循环(省略条件判断),不达到一千的产量誓不罢休for(let i = 2;;i++){ //第二年开始生小牛,所以循环变量初始值是2sum += parseInt(sum/2);if(sum >= 1000){console.log("第" + i + "年,牛的数量是" + sum);//第17年,牛的数量是1066break; //完成任务,停止循环}}
