二十三、算法练习

二十三、算法练习

唐浩强c语言提出了一个公式:

编程=算法+数据结构

JS中的数据结构只有两个(不考虑ES6、7、8):数组、对象

算法层面,你的工具:

1
for  if  while  if  switch  函数

例1,计算n的阶加,1+2+3+……+n

1
2
3
4
5
6
7
8
9
<script>
function sum(n){ // 接收一个参数
var _sum = 0;
for(var i = 0 ; i <= n ; i++){
_sum += i;
}
return _sum; // 返回它的阶加
}
</script>

例2,计算阶乘:

1
2
3
4
5
function factorial(n){
if(n == 0) return 0;
if(n == 1) return 1; //计算时使 n - 1 不为负
return n * factorial(n - 1); // 递归函数
}

例3:寻找喇叭花数

各个数位的阶乘和等于它本身

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<script>
// 计算阶乘
function factorial(n){
if(n == 0) return 0;
if(n == 1) return 1; //计算时使 n - 1 不为负
return n * factorial(n - 1); // 递归函数
}
// 寻找喇叭花数
function findLabahua(){
for(var i = 100 ; i <= 999 ; i++){
var sum = 0;
for(var j = 0 ; j <=2 ; j++){
// 将 i转为字符串,取第 1个数字,再转回数字类型
// 将 i转为字符串,取第 2个数字,再转回数字类型
// 将 i转为字符串,取第 3个数字,再转回数字类型
// 计算 3 个数字的阶乘
// 将三个数字的阶乘累加
sum += factorial(Number( i.toString().charAt(j)));
}
// 如果阶乘和等于原数,则是喇叭花数
if(sum == i) console.log(i + "是喇叭花数"); // 一行if语句不用大括号
}
}
findLabahua();
</script>

一些问题举例:

有一个重要题型,让你判断程序运行结果。

这种问题,一定是找“坑点”出:

1
2
3
4
5
6
变量声明提升的undefined的问题
变量的作用域,遮蔽问题
if语句是不能阻止var的提升的
没有加var,执行赋值了,这个变量是全局变量
闭包的问题
for循环的执行机理

例子1:

1
2
3
4
5
6
7
8
<script>
var a = 10;
function fun(){
alert(a);
var a = 20;
}
fun(); // undefined
</script>

弹出undefined。

因为函数中的var定义的变量,能够自动提升声明到函数的最开始,所以遮蔽了外部的 a 。

例子2:

1
2
3
4
5
6
7
8
9
10
11
<script>
var a = 10;
function fun(){
var a = 20;
return function(){
alert(a);
}
}
var f = fun();
f(); // 20
</script>

弹出 20

这是一个经典的闭包的例子。

什么是闭包:

函数能够记住自己定义时候所处的作用域,无论函数在哪里运行,都不会忘记最初的作用域。

例子3:

1
2
3
4
5
6
7
8
9
10
<script>
var a = 3;
function fun(){
alert(a);
if(!a){
var a = 5;
}
alert(a);
}
fun(); // 先弹出 undefined ,再弹出 5

先弹出 undefined ,再弹出 5

if语句的真假性,不会影响变量声明的提升。

所以即使感觉 !a 是假,但是var a 提升是必然的。所以判断的是 !undefined , 能够进入if,给 a 赋值为 5 ,就弹出 5

例子4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script>
function fun(){
a = b = 2;
}
fun();
alert(a); // a 变为全局变量 弹出 2
alert(b); // b 也是 2
</script>


<script>
function fun(){
var a = b = 2;
}
fun();
alert(b); // 弹出 2
alert(a); // 报错 Uncaught ReferenceError: a is not defined
</script>

连续使用赋值运算符,会从右边忘左边进行赋值。

所以b = 2 a = 2 。但是b没有被var,作用域就溢出了,就是全局作用域,能弹出结果2 。 a 是被var的,出不来。

如果写成:

1
var a = 1 , b = 2;

中间用逗号隔开,说明a b 都被var了,都出不来。

即,等价于:

1
2
var a = 1;
var b = 2;
点击查看

本文标题:二十三、算法练习

文章作者:Mango

发布时间:2020年07月08日 - 21:58:31

最后更新:2020年07月08日 - 22:35:39

原始链接:https://mango185.github.io/post/d742b19d.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------