解锁所有课程内容,保存学习进度,系统化学习编程
欢迎来到函数练习课程!这节课将通过6个精心设计的练习,全面巩固你之前学习的函数知识。
本课程完全以练习为导向,通过大量动手实践来:
练习按照难度递进设计,从简单到复杂:
每个练习都包含:
让我们开始练习吧!
任务要求:
💡 解题思路:
这是一个数组遍历比较问题,步骤如下:
关键点:
任务要求:
filterGreaterThan:过滤出所有大于指定阈值的数字filterEvenNumbers:过滤出所有偶数💡 提示:
let result: number[] = [] 创建结果数组numbers[i] > threshold 和 numbers[i] % 2 === 0result.push() 方法将符合条件的元素添加到结果数组什么是平方?
在数学中,平方就是一个数字自己乘自己(乘2次)。
平方的计算方法:
0²)1²)2²)3²)10²)代码中的计算方法:
什么是完美平方数?
完美平方数是可以表示为某个整数的平方的数:
常见完美平方数:0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100...
重要说明:负数不是完美平方数
完美平方数必须是非负的(≥0)。任何负数都不可能是完美平方数,因为:
闰年是历法中的一个重要概念。闰年有366天(2月有29天),而平年有365天(2月只有28天)。
为什么要有闰年?
地球绕太阳公转一周大约需要365.2422天,不是整数。为了保持日历与季节同步,每4年增加1天(闰年),但这样又多算了,所以有了更复杂的规则。
什么是闰年?
判断闰年有明确的规则:满足以下任意一个条件就是闰年
举例说明:
任务要求:
isLeapYear 函数:判断某年是否为闰年findLeapYears 函数:找出指定范围内的所有闰年💡 解题思路:
这是一个多条件判断问题,需要使用逻辑运算符组合条件:
判断闰年的条件:
关键点:
&& 比 || 优先级高,注意括号的使用|| 表示"或",&& 表示"且"问题描述:
已知两个正整数的和,找出乘积最大的那一对数。
枚举(Enumeration)就是系统性地列出所有可能的情况,然后从中找出答案。
生活中的枚举:
想象你在开一个三位数的密码锁,但你忘了密码。最可靠的方法是什么?
枚举法:从 000 开始,一个一个尝试
这就是枚举——把所有可能性都试一遍,保证能找到答案!
编程中的枚举:
在编程中,我们用循环来自动完成枚举过程。
程序可以每秒尝试成千上万次,比人工快得多!
枚举的特点:
在这道题中,我们就用枚举法来解决!
手动思考:如果不用程序,你应该怎么算?
假设和是 10,我们需要找出哪两个数相加等于10,而且乘积最大。
最保险的方法是系统性地枚举所有可能,这样既不会重复也不会漏掉:
手动枚举的关键:
程序能做什么?
程序可以帮我们自动化这个"枚举所有可能、找出最大值"的过程,而且速度更快!
幸运数字定义:能被7整除或者包含数字7的数字
条件1:能被7整除
一个数能被7整除,意味着它除以7没有余数。例如:
条件2:包含数字7
一个数的任何一位是7,就算包含数字7。例如:
判断规则:
只要满足两个条件中的任意一个,就是幸运数字:
编程实现思路:
我们需要实现几个函数来判断幸运数字:
isDivisibleBy7(number):判断能否被7整除
%number % 7 === 0 表示能被7整除containsDigit7(number):判断是否包含数字7
如何逐个检查数字的每一位?
💡 学习提示:这个问题的解决思路很巧妙,也很直观。虽然思想简单,但要把它写成正确的代码,需要你仔细理解和认真实践。不要着急,慢慢看,动手试一试!
我们需要检查数字的每一位是否为7,但数字可能有很多位。如何逐个获取每一位呢?
核心技巧:获取个位数
使用取余运算符 % 可以轻松获取数字的个位数:
237 ÷ 10 = 23 余 7% 10 就是求除以10的余数,正好是个位数那如何获取十位数、百位数呢?
我们已经学会了用 % 10 获取个位数,那十位数、百位数该怎么获取呢?
核心思路:把十位数"移到"个位上来
如果能让所有数字向右移动一位,那原来的十位数就会跑到个位上!就像这样:
如何实现"数字向右移动"?用除法!
237 / 10 等于 23.7(有小数点)Math.floor(23.7) 向下取整,得到 23(去掉小数部分)3 变成了新的个位数,我们就可以用 % 10 获取它了!重复这个过程,就能逐个获取每一位数字
完整的逐位检查过程:
让我们用代码来演示检查数字63是否包含7:
如何将手工步骤转换为while循环?
观察上面的代码,你会发现有个重复的模式:
这种重复模式正是while循环的用武之地!
关键理解:
while (number > 0):只要数字还没变成0,就继续检查break 语句:一旦找到7,立即退出循环(提高效率)任务要求:
isDivisibleBy7:判断能否被7整除containsDigit7:判断是否包含数字7isLuckyNumber:综合判断幸运数字(两个条件任一满足)findLuckyNumbers:找出指定范围内的所有幸运数字💡 提示:
number % 7 === 0 判断是否能被7整除containsDigit7 中,先用 if (number < 0) number = -number 处理负数while (number > 0) 循环检查每一位数字isLuckyNumber 可以直接调用前两个函数:return isDivisibleBy7(number) || containsDigit7(number)通过这6个练习,你已经掌握了基础数组操作和数学概念的编程应用:
数组操作:
push() 方法添加元素到数组末尾数学概念:
i * i <= number 优化循环% 10 和 Math.floor(number / 10))编程技巧:
&& 和 || 运算符组合复杂条件任务要求:
isPerfectSquare 函数:判断是否为完美平方数findPerfectSquares 函数:找出0到limit范围内的所有完美平方数💡 提示:
for (let i = 0; i * i <= number; i += 1) 遍历i * i === number循环条件详解:为什么使用 i * i <= number?
关键理解:我们不需要遍历到 number
判断完美平方数时,我们不需要检查 i 从 0 到 number 的所有值。
数学原理:
如果 number 是完美平方数,那么存在一个整数 i 使得 i² = number。
i * i < number 时:i 的平方还小于目标数,需要继续检查i * i = number 时:找到了!i 就是 number 的平方根i * i > number 时:i 的平方已经超过目标数,后续更大的 i 会使 i² 更大,不可能再等于 number为什么这个条件高效?
如果不使用 i * i <= number,而是使用 i <= number:
number = 10000 时,需要循环 10001 次(从 0 到 10000)i * i <= number,只需要循环 101 次(从 0 到 100)任务要求:
findMaxProduct 函数:已知两个正整数的和,找出乘积最大的那一对数💡 解题思路:
这是一个搜索问题,我们可以用"枚举法"来解决:尝试所有可能的组合,找出最优解。
步骤:
关键点:
💡 进一步思考:你能优化这个程序吗?
观察我们前面的枚举表格,你会发现:
我们的程序会重复计算这些组合!你能想出办法让程序只枚举到中间(第1个数 <= 第2个数),避免这些重复计算吗?
试试修改循环条件,让程序更高效!