知识回顾-流程的切割
函数的作用
使用函数切割流程,不仅可以减少重复代码、还可以有效的降低整体复杂度 a-(b-c-d)-e-(b-c-d)-f 可以看出bcd这流程重复了,我们就可以将bcd给流程分割成函数。
函数的常见问题
如何理解函数的参数、返回值、函数体?
参数:表示完成流程所需的必要信息
返回值:表示完成流程后产生的结果
函数体:表示具体的流程
函数的参数、返回值只取决于函数的作用,与函数体无关
为什么我觉得有了函数之后,程序反而变得更复杂了?
函数的核心作用,是为了让某一段复杂的流程变得简单。
如果在函数的帮助下,反而觉得流程变得复杂了,极有可能的原因是开发思想没有做相应的切割,导致思想负担过重。
始终记住以下两点:
- 定义函数时,只需要考虑这个函数如何实现即可,完全不需要考虑其他无关的东西。
- 调用函数时,只需要考虑向其传递什么参数,如何使用它的返回结果,完全无需考虑函数的具体实现。
函数具有三要素:函数名、参数、返回值
只要具备三要素,就能书写函数体;只要具备三要素,就能完成函数调用。
学习函数时不知道该如何切割流程怎么办?
要完成一个函数声明,分为两步:
设计函数
设计函数就是如何切割流程,具体来说就是设计出函数的三要素,这一步是最难的,目前无须同学们掌握,老师会帮你把函数设计好。
书写函数体
根据设计的三要素完成函数体,这一步就是现阶段练习的重点。
函数练习
js
/**
* 得到某个数的阶乘
* 如果数小于了1,则得到0
* @param {number} n 要求阶乘的数
* @return {number} 阶乘结果
*/
function factorial(n) {
if (n < 0) {
console.log("传入的必须是非负整数");
}
if (n == 0) {
return 1;
}
return n * factorial(n - 1);
}
// 利用上面的函数,完成下面的练习题
/*
1. 输出5的阶乘
*/
console.log(factorial(5));
/*
2. 求5和6的阶乘之和,然后输出
*/
console.log(factorial(5) + factorial(6));
/*
3. 输出阶乘结果不超过1000的所有数字
*/
for (let i = 1; i <= 1000; i++) {
if (factorial(i) > 1000) {
break
}
console.log(i);
}js
// 完成下面的函数
/**
* 在arr中寻找是否存在target
* @param {Array} arr 要遍历寻找的数组
* @param {any} target 要寻找的目标
* @return {boolean} 是否找到
*/
function includes(arr, target) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) {
return true
}
}
return false
}
// 利用上面的函数,完成下面的练习题
var nums = [1, 3, 8, 2, 5, 1, 9];
/*
1. 判断nums中是否存在8,输出是或否
*/
console.log(includes(nums, 8));
/*
2. 判断数字2是否同时存在于nums和nums2中,输出是或否
*/
var nums2 = [6, 3, 2, 7, 11, 33];
console.log(includes(nums, 2) && includes(nums2, 2));
/*
3. 思考题:判断nums3中是否所有数字都在nums中存在,输出是或否
*/
var nums3 = [2, 5, 1];
// 方法一:查找
let isFind = false;
for (let i = 0; i < nums3.length; i++) {
if (!includes(nums, nums3[i])) {
isFind = false;
break;
}
isFind = true;
}
console.log(isFind ? "是" : "否");
// 方法二:对比
let flag = true;
for (let i = 0; i < nums3.length; i++) {
flag = flag && includes(nums, nums3[i]);
if (!flag) {
break;
}
}
console.log(flag ? "是" : "否");