Skip to content

知识回顾-流程的切割

函数的作用

使用函数切割流程,不仅可以减少重复代码、还可以有效的降低整体复杂度 a-(b-c-d)-e-(b-c-d)-f 可以看出bcd这流程重复了,我们就可以将bcd给流程分割成函数。

函数的常见问题

如何理解函数的参数、返回值、函数体?

参数:表示完成流程所需的必要信息

返回值:表示完成流程后产生的结果

函数体:表示具体的流程

函数的参数、返回值只取决于函数的作用,与函数体无关

为什么我觉得有了函数之后,程序反而变得更复杂了?

函数的核心作用,是为了让某一段复杂的流程变得简单。

如果在函数的帮助下,反而觉得流程变得复杂了,极有可能的原因是开发思想没有做相应的切割,导致思想负担过重。

始终记住以下两点

  1. 定义函数时,只需要考虑这个函数如何实现即可,完全不需要考虑其他无关的东西。
  2. 调用函数时,只需要考虑向其传递什么参数,如何使用它的返回结果,完全无需考虑函数的具体实现。

函数具有三要素:函数名、参数、返回值

只要具备三要素,就能书写函数体;只要具备三要素,就能完成函数调用。

学习函数时不知道该如何切割流程怎么办?

要完成一个函数声明,分为两步:

  1. 设计函数

    设计函数就是如何切割流程,具体来说就是设计出函数的三要素,这一步是最难的,目前无须同学们掌握,老师会帮你把函数设计好。

  2. 书写函数体

    根据设计的三要素完成函数体,这一步就是现阶段练习的重点。

函数练习

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 ? "是" : "否");

MIT License