1、循环结构-for
1、while
在控制台上输出1-100之间所有的数字
//1、声明条件:从1开始
var i=1;
//2、循环结构-循环条件
while(i<=100){//条件
console.log(i);//3、操作
i++;//4、更新循环变量
}
2、for语法
for(表达式1;表达式2;表达式3){
//循环操作
}
表达式1:声明条件
表达式2:循环条件判断
表达式3:更新循环变量
for循环执行流程:
1、计算表达式1的值
2、计算表达式2的值(boolean),如果为true,则执行循环体,如果为false,则退出循环
3、执行循环体
4、计算表达式3的值
5、计算表达式2... ...
3、for语句三个表达式的特殊用法
1、表达式1 允许为空
for(;表达式2;表达式3){
}
表达式1;
for(;表达式2;表达式3){
}
2、表达式2 允许为空
如果省略的话,则为死循环
最好在循环内部补充退出条件
3、表达式3 允许为空
死循环
4、三个表达式都允许为空
for(;;){
console.log("这是死循环");
}
5、表达式1 和 表达式3 的内容可以多样化
允许编写多个表达式
4、循环嵌套
for/while/do.while 多允许相互嵌套或转化
循环嵌套:在一个循环中,又出现另一个循环
for(var i=1;i<=10;i++){
for(var j=1;j<=10;j++){
console.log(j);
}
}
5、while/do..while/for 的异同点
1、for 和 while
共同点:
先判断条件,再执行循环体
使用场合:
1、for
优先使用在确定循环次数的场合下
2、while
优先使用在不确定循环次数的场合下
2、do...while
先执行循环操作,再判断循环条件
最少 执行1次循环
场合:
1、优先适用于不确定循环次数的场合下
2、先执行循环体,根据循环体内的操作决定循环条件时,使用do...while
练习:
要求用户 弹框中分别输入 年,月,日
求:该日 是星期?
前提:1900.1.1 是星期一
求:2016.10.28
1900.1.1 - 2015.12.31 : x
2016.1.1 - 2016.9.30 :y
2016.10.28 距 1900.1.1 :x+y+28
练习:
1、控制台上 打印输出 *
2、控制台上 打印输出 *****
3、控制台上 打印输出
*****
*****
*****
*****
*****
4、控制台上 打印输出 以下内容
* 第1行 1个星星
** 第2行 2个星星
*** 第3行 3个星星
**** 第4行 4个星星
***** 第5行 5个星星
5、打印99乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
.....
1*9=9 2*9=18 3*9=27 4*9=36
3、练习
1、打印输出 1-1000之间所有的奇数
2、计算 1-1000 所有偶数的和
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
...
3、素数
从3 开始
3 是素数
4 不是素数
5 是素数
6 不是素数
7 是素数
8 不是素数
9 不是
10 不是
11 是
有一对兔子,从出生的第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假如兔子都不死,问某个月的兔子总和是多少
1,1,2,3,5,8,... ...
1,1,2,3,5,8,13,21,34,55,89
斐波那契数列
var n1=1,n2=1;
n1 = n1 + n2;
n2 = n1 + n2;
console.log(n1);
console.log(n2);
n1 = n1 + n2;
n2 = n1 + n2;
console.log(n1);
console.log(n2);
求:数列中,某位上的数字时多少
假定 f(10); 想求 第10个月 兔子的总量
f(20); 想求 第20个月 兔子的总量
f(5); 想求 第5个月 兔子的总量
f(4); 想求 第4个月 兔子的总量
f(3); 想求 第3个月 兔子的总量
f(2); 想求 第2个月 兔子的总量 = 1
f(1); 想求 第1个月 兔子的总量 = 1
f(3)=f(2)+f(1)
f(4)=f(3)+f(2)
f(5)=f(4)+f(3)
...
f(100)=f(99)+f(98)
1、while
在控制台上输出1-100之间所有的数字
//1、声明条件:从1开始
var i=1;
//2、循环结构-循环条件
while(i<=100){//条件
console.log(i);//3、操作
i++;//4、更新循环变量
}
2、for语法
for(表达式1;表达式2;表达式3){
//循环操作
}
表达式1:声明条件
表达式2:循环条件判断
表达式3:更新循环变量
for循环执行流程:
1、计算表达式1的值
2、计算表达式2的值(boolean),如果为true,则执行循环体,如果为false,则退出循环
3、执行循环体
4、计算表达式3的值
5、计算表达式2... ...
3、for语句三个表达式的特殊用法
1、表达式1 允许为空
for(;表达式2;表达式3){
}
表达式1;
for(;表达式2;表达式3){
}
2、表达式2 允许为空
如果省略的话,则为死循环
最好在循环内部补充退出条件
3、表达式3 允许为空
死循环
4、三个表达式都允许为空
for(;;){
console.log("这是死循环");
}
5、表达式1 和 表达式3 的内容可以多样化
允许编写多个表达式
4、循环嵌套
for/while/do.while 多允许相互嵌套或转化
循环嵌套:在一个循环中,又出现另一个循环
for(var i=1;i<=10;i++){
for(var j=1;j<=10;j++){
console.log(j);
}
}
5、while/do..while/for 的异同点
1、for 和 while
共同点:
先判断条件,再执行循环体
使用场合:
1、for
优先使用在确定循环次数的场合下
2、while
优先使用在不确定循环次数的场合下
2、do...while
先执行循环操作,再判断循环条件
最少 执行1次循环
场合:
1、优先适用于不确定循环次数的场合下
2、先执行循环体,根据循环体内的操作决定循环条件时,使用do...while
练习:
要求用户 弹框中分别输入 年,月,日
求:该日 是星期?
前提:1900.1.1 是星期一
求:2016.10.28
1900.1.1 - 2015.12.31 : x
2016.1.1 - 2016.9.30 :y
2016.10.28 距 1900.1.1 :x+y+28
<!doctype html>
<html>
<head>
<title>标题</title>
<meta charset="utf-8">
</head>
<body>
<script>
function calDate(){
//1、输入年(year)月(month)日(day)
var year=Number(prompt("Year:"));
var month=Number(prompt("Month:"));
var day=Number(prompt("Day:"));
var totalDays=0;
//2、从1900 到 year-1 年 共有多少天
for(var i=1900;i<year;i++){
//i表示从1900年开始的每一年
if(i%4==0&&i%100!=0||i%400==0){
totalDays+=366;
}else{
totalDays+=365;
}
}
//3、year 年的1.1日 到 month-1月共有多少天
for(var i=1;i<month;i++){
//i表示的从1月开始的每一月
switch(i){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
totalDays+=31;
break;
case 4:
case 6:
case 9:
case 11:
totalDays+=30;
break;
case 2:
if(year%4==0&&year%100!=0||year%400==0){
totalDays+=29;
}else{
totalDays+=28;
}
break;
}
}
//4、累加 day
totalDays += day;
//5、计算 是星期?
var date=totalDays % 7;
var msg="";
switch(date){
case 0:
msg="日";
break;
case 1:
msg="一";
break;
case 2:
msg="二";
break;
case 3:
msg="三";
break;
case 4:
msg="四";
break;
case 5:
msg="五";
break;
case 6:
msg="六";
break;
}
console.log(year+"年"+month+"月"+day+"日是星期"+msg);
}
</script>
<button οnclick="calDate();">日期计算器</button>
</body>
</html>
练习:
1、控制台上 打印输出 *
2、控制台上 打印输出 *****
3、控制台上 打印输出
*****
*****
*****
*****
*****
4、控制台上 打印输出 以下内容
* 第1行 1个星星
** 第2行 2个星星
*** 第3行 3个星星
**** 第4行 4个星星
***** 第5行 5个星星
5、打印99乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
.....
1*9=9 2*9=18 3*9=27 4*9=36
<!doctype html>
<html>
<head>
<title>标题</title>
<meta charset="utf-8">
</head>
<body>
<script>
function printStar(){
for(var j=1;j<=9;j++){//控制行数
var msg="";
for(var i=1;i<=j;i++){//控制星星个数
msg+="*";
}
console.log(msg);
}
}
/*打印 99乘法表*/
function print99(){
//循环 9行
for(var i=1;i<=9;i++){
var msg="";
for(var j=1;j<=i;j++){
msg+=(j+"*"+i+"="+(j*i)+"\t");
}
console.log(msg);
}
}
</script>
<button οnclick="printStar()">打印星星</button>
<button οnclick="print99();">打印99乘法表</button>
</body>
</html>
3、练习
1、打印输出 1-1000之间所有的奇数
2、计算 1-1000 所有偶数的和
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
...
3、素数
从3 开始
3 是素数
4 不是素数
5 是素数
6 不是素数
7 是素数
8 不是素数
9 不是
10 不是
11 是
有一对兔子,从出生的第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假如兔子都不死,问某个月的兔子总和是多少
1,1,2,3,5,8,... ...
1,1,2,3,5,8,13,21,34,55,89
斐波那契数列
var n1=1,n2=1;
n1 = n1 + n2;
n2 = n1 + n2;
console.log(n1);
console.log(n2);
n1 = n1 + n2;
n2 = n1 + n2;
console.log(n1);
console.log(n2);
求:数列中,某位上的数字时多少
假定 f(10); 想求 第10个月 兔子的总量
f(20); 想求 第20个月 兔子的总量
f(5); 想求 第5个月 兔子的总量
f(4); 想求 第4个月 兔子的总量
f(3); 想求 第3个月 兔子的总量
f(2); 想求 第2个月 兔子的总量 = 1
f(1); 想求 第1个月 兔子的总量 = 1
f(3)=f(2)+f(1)
f(4)=f(3)+f(2)
f(5)=f(4)+f(3)
...
f(100)=f(99)+f(98)
<!doctype html>
<html>
<head>
<title>标题</title>
<meta charset="utf-8">
</head>
<body>
<script>
/*1、打印 1-1000之间所有的奇数*/
function fun1(){
//循环条件:从1开始,到第1000次
//循环操作:判断 条件的数值是否为奇数,如果为奇数的话,则打印输出
/*for(var i=1;i<=1000;i++){
if(i % 2 == 1){
console.log(i);
}
}*/
for(var i=1;i<=1000;i+=2){
console.log(i);
}
}
/*2、计算 1-1000之间所有偶数的和*/
function fun2(){
var sum=0;//用于累加所有偶数的和
/*for(var i=1;i<=1000;i++){
if(i % 2 == 0){
sum+=i;
}
}*/
for(var i=2;i<=1000;i+=2){
sum+=i;
}
console.log("和为:"+sum);
}
/*3、打印 乘法口诀表中任意一行*/
function fun3(){
/*1*3=3 2*3=6 3*3=9 */
var line=prompt("想打印第?行:");
var result="";
for(var i=1;i<=line;i++){
var sum = i * line;
result += (i+"*"+line+"="+sum+"\t");
}
console.log(result);
}
/*4、累加 1/1+1/3+1/5+...+1/999的和*/
function fun4(){
var sum=0;
for(var i=1;i<=999;i+=2){
sum += 1/i;
}
console.log(sum);
}
/*5、判断一个数字是否为素数*/
function fun5(){
var num=Number(prompt("输入一个数字:"));
var isSu=true;//假设 默认是素数
for(var i=2;i<=num/2;i++){
if(num % i == 0){
isSu=false;
break;
}
}
if(isSu){
console.log("是素数");
}else{
console.log("不是素数");
}
}
/*6、有一对兔子,从出生的第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假如兔子都不死,问某个月的兔子总和是多少*/
function fun6(){
var n1=1,n2=1;
for(var i=1;i<=10;i++){
console.log(n1,n2);
n1 = n1 + n2;
n2 = n1 + n2;
}
}
/*7、递归函数:求某个月的兔子的总量*/
function f(n){
if(n==2 || n==1){
return 1;
}
return f(n-1)+f(n-2);
}
/*
递归:在函数内,又调用了自己
递归调用的内层函数,是在外层函数还未结束时就已经开始了,外层函数的调用,就会被阻塞
缺点:算法复杂度太高,且浪费内存
解决:绝大部分递归,可以使用循环替代
*/
function fun7(n){
if(n == 1 || n == 2){
return 1;
}else{
var f1=1,f2=1,fn;
for(var i=1;i<=n-2;i++){
fn=f1+f2;
f1=f2;
f2=fn;
}
return fn;
}
}
</script>
<button οnclick="fun1()">打印1-1000之间所有的奇数</button>
<button οnclick="fun2()">打印1-1000之间所有偶数和</button>
<button οnclick="fun3()">打印乘法口诀中任意一行</button>
<button οnclick="fun4()">打印数列的和</button>
<button οnclick="fun5()">判断素数</button>
<button οnclick="fun6()">打印斐波那契数列</button>
<button οnclick="console.log(f(20));">递归调用</button>
<button οnclick="console.log(fun7(20));">非递归调用求兔子总量</button>
</body>
</html>