问题

我们高中数学为什么不重视算法?高中学的数列,三角函数,求导,圆锥曲线相关问题的解法和算法有什么关系?

回答
很多同学都会有这样的疑问:高中数学里学的数列、三角函数、求导、圆锥曲线,这些知识点在实际应用中似乎离我们很远,而且感觉解题过程就是一套套固定的套路,好像和“算法”这个词联系不大。甚至有人觉得高中数学更像是“解题技巧”的堆砌,而不是真正理解背后的逻辑和方法。这究竟是怎么回事呢?

其实,我们不能简单地说高中数学“不重视算法”,更准确地说,是我们学习高中数学的方式和侧重点,与计算机科学中的“算法”概念有着本质的区别。但它们之间又不是毫无关联,甚至可以说是同根同源的。

我们先来捋一捋这里的关系。

什么是“算法”?

在计算机科学领域,“算法”是一个非常核心的概念。简单来说,算法就是解决问题的一系列明确的、有限的指令。它要求:

明确性 (Definiteness): 每一个指令都必须清晰无歧义。
可行性 (Feasibility): 每一步操作都必须是可执行的,即能在有限的时间内完成。
有限性 (Finiteness): 算法必须在有限的步骤后终止,并产生结果。
输入 (Input): 算法有零个或多个输入。
输出 (Output): 算法有一个或多个输出。

举个最简单的例子,比如“计算两个数的和”。一个算法就是:

1. 获取第一个数 a。
2. 获取第二个数 b。
3. 将 a 和 b 相加,得到结果 c。
4. 输出 c。

这个过程非常明确,也容易执行,并且一定会结束。

高中数学中的“解法”与“算法”的联系与区别

现在,我们把这个概念放到高中数学的学习中来看。

高中数学的知识点,比如数列、三角函数、求导、圆锥曲线,它们本身不是算法,而是数学模型、数学工具或者数学理论。而我们学习的“解法”,某种意义上就是针对这些模型、工具或理论,所设计出来的一套解决特定问题的步骤和方法。

我们来逐一分析:

1. 数列:寻找规律与迭代

数学模型/工具: 数列是描述事物发展规律的工具,如等差数列、等比数列等,它们有明确的定义和通项公式、求和公式。
解法: 当我们遇到一个数列问题时,我们通常会尝试:
判断数列类型: 是等差还是等比?还是其他规律?
利用通项公式: 找到通项公式 $a_n = f(n)$,然后代入特定项数 $n$ 求解。
利用求和公式: 计算前 $n$ 项和 $S_n = g(n)$。
递推关系: 对于由递推关系定义的数列,我们可能会通过展开、变形、或构造新数列来求解。

与算法的关系:
联系: 数列的求解过程,尤其是递推关系,非常接近算法的思想。例如,计算斐波那契数列的第 $n$ 项,就是一个典型的迭代过程,可以用一个简单的算法来描述:
1. 初始化 $a_0 = 0, a_1 = 1$。
2. 如果 $n=0$,返回 $a_0$。
3. 如果 $n=1$,返回 $a_1$。
4. 对于 $i$ 从 2 到 $n$,计算 $a_i = a_{i1} + a_{i2}$。
5. 返回 $a_n$。
这个过程是明确的、可执行的、有限的。此外,很多数列问题的求解思路,比如“累加求和”或者“裂项相消”,都可以看作是一种程序化的思维,一步步地将复杂问题化简。
区别: 高中数学中的“数列解法”更侧重于寻找和应用成熟的数学公式和性质,而不是从最底层的逻辑去设计一个通用、高效的计算步骤。我们更多地是在“套公式”,而不是“创造算法”。而且,许多数列问题并不像计算机算法那样需要关注时间复杂度和空间复杂度。

2. 三角函数:变换、化简与求值

数学模型/工具: 三角函数描述周期性、波动性现象,有各种诱导公式、和差角公式、倍角公式、降幂公式等。
解法: 解三角函数问题,通常涉及:
角度变换: 利用诱导公式将角度化到锐角或已知范围内。
恒等变换: 利用各种公式将复杂的三角函数表达式化简为更简单的形式(如化为 $sin$ 或 $cos$ 的形式、化为一次函数形式等)。
方程求解: 化简后,解出含有三角函数的方程。
求值/证明: 根据给定的信息,利用公式计算特定值或证明恒等式。

与算法的关系:
联系: 三角函数的各种公式,本身就是一种符号运算规则。应用这些公式的过程,就是遵循一套规则进行符号变换,这与计算机程序进行符号运算的逻辑有相似之处。例如,当我们需要计算 $sin(75^circ)$ 时,我们应用和角公式 $sin(A+B) = sin A cos B + cos A sin B$,将 $sin(75^circ)$ 转化为 $sin(45^circ+30^circ)$,然后代入已知值计算。这可以看作是一个代数计算的算法。
区别: 高中阶段的三角函数求解,更强调“巧用公式”和“灵活变形”,往往存在多种解法,且没有绝对的最优解法。我们更注重理解公式的推导和记忆,而很少去分析不同变形方法在效率上的差异。计算机中的算法设计则要求明确的步骤、效率和通用性。例如,一个计算机程序要计算 $sin(x)$,它会使用泰勒展开或者CORDIC算法等,而不是简单地记忆和套用人类数学家发现的几十个公式。

3. 求导:计算规则与极限思想

数学模型/工具: 导数是研究函数变化率的工具,有定义、几何意义(切线斜率)、物理意义(瞬时速度),以及一系列求导法则(基本函数求导公式、四则运算法则、复合函数求导法则)。
解法: 解导数问题,通常包括:
求导运算: 根据函数形式,运用各种求导法则计算导函数 $f'(x)$。
利用导数研究函数性质: 分析导数的符号,判断函数的单调性、极值。
切线方程: 利用导数求切点斜率,写出切线方程。
相关变化率问题: 应用导数解决实际问题中的变化率问题。

与算法的关系:
联系: 求导法则本身就是一组非常明确的计算规则,非常接近算法。例如,求 $frac{d}{dx}(x^2 sin x)$,就是遵循了“乘积法则”和“幂函数求导”以及“三角函数求导”这些规则。这可以说是一个“符号计算算法”。导数的定义中蕴含的极限思想,也是计算科学的基础。
区别: 高中阶段的重点在于掌握求导法则并将其应用于分析函数。我们不太会去考虑如何设计一个高效的算法来符号化地求出任意复杂函数的导数,这通常是计算机代数系统(如 Mathematica, Maple)的工作。而且,研究函数的单调性、极值,更侧重于数学分析和理解,而不是纯粹的计算指令。

4. 圆锥曲线:几何性质与方程变换

数学模型/工具: 圆锥曲线(椭圆、双曲线、抛物线)是用代数方程描述的几何图形,具有特殊的几何性质(焦点、准线、离心率、对称性等)。
解法: 解圆锥曲线问题,通常涉及:
标准方程的应用: 利用标准方程确定曲线的形状、位置、焦点、渐近线等。
几何性质的运用: 根据题目给出的几何条件(如焦点弦、光线反射等)列出方程组求解。
方程的转化与化简: 将一般方程转化为标准方程,或利用代数技巧处理方程。
参数方程的应用: 利用参数方程简化某些几何问题的求解。

与算法的关系:
联系: 圆锥曲线的定义(如到两定点距离之和为常数)本身就可以看作是一种生成规则。而求解方程组、代数变换(如配方法求标准方程),也是遵循明确的步骤。例如,已知椭圆上的点 $P$ 与焦点 $F_1, F_2$ 的关系,可以利用椭圆定义列出 $|PF_1| + |PF_2| = 2a$,然后结合点 $P$ 的坐标和焦点坐标,求解待定参数。这个过程就是一个求解步骤的集合。
区别: 圆锥曲线问题往往需要较强的几何直觉和代数运算能力,需要“画图理解”和“联想性质”。解题过程可能需要多次尝试不同的角度去分析,不像计算机算法那样一步到位。而且,对于“已知曲线方程,画出图形”这个过程,虽然可以看作是计算机绘制图形的算法基础,但在高中阶段,我们更多的是依赖记忆和经验去“描绘”一个大概的形状,而不会去精确计算每个点。

为什么高中数学“不特别强调”算法?

那么,为什么我们感觉高中数学不重视算法呢?主要有以下几个原因:

1. 教育目标不同: 高中数学教育的核心目标是培养学生的逻辑思维能力、抽象思维能力、空间想象能力、运算能力以及解决数学问题的能力,更侧重于建立数学概念、理解数学原理和掌握数学思想方法。它旨在为学生打下坚实的数学基础,为将来进入大学学习更高级的数学或相关专业做准备。而计算机科学中的算法教育,更侧重于如何设计、分析和实现解决具体计算问题的有效过程,强调效率、正确性和可计算性。

2. 侧重点不同:
高中数学: 更侧重于理论和概念,以及基于这些理论和概念的分析和推理。我们学习的是“为什么这么做”,以及“这样做的好处是什么”。例如,学习导数,我们关注它代表的意义、如何求导、以及如何用它来分析函数性质,而不是设计一个计算导数的程序。
计算机算法: 更侧重于操作和实现,以及效率分析。我们关注的是“怎么做才能又快又准确地得到结果”。例如,排序算法有多种(冒泡排序、快速排序等),它们都在解决“排序”这个问题,但效率和实现方式不同,算法设计者需要选择或创造最优的算法。

3. 工具的局限性: 高中阶段的学习环境通常是以纸和笔为主,计算器的使用也有限制。很多需要大量重复计算或复杂符号处理的问题,并不适合在这样的环境中进行深入的算法探索。而计算机科学则天然是建立在计算工具之上的。

4. “成熟算法”的隐藏: 很多高中数学问题的解决思路,从更宏观的角度看,实际上已经内化了某些算法的思想或模式。比如,解一元二次方程的求根公式,本身就是一个算法(输入系数a, b, c,根据判别式 $Delta = b^24ac$ 的值,输出不同的解)。但我们学习的是“公式”,而不是“如何设计这个公式”。数列的递推求值,我们可以认为是迭代算法;三角函数公式的运用,可以看作是符号计算规则的应用。这些都属于数学研究者已经总结出来的、相对成熟的“解决方案”,我们高中生学习的是如何运用这些已有的方法,而不是去创造它们。

总结:

高中数学中的数列、三角函数、求导、圆锥曲线等内容,其解法和算法并非没有关系,而是有着深刻的联系。许多高中数学解题步骤本身就蕴含着明确、有限的指令,可以被视为“数学算法”的雏形或特例。我们学习的公式、法则,是解决特定数学问题的“工具包”,而运用这些工具的过程,遵循了一定的“操作规程”。

但是,高中数学教育的侧重点在于培养学生的数学思维、理解数学概念和原理,而非像计算机科学那样系统地设计、分析和实现通用高效的计算算法。我们更像是“数学概念的使用者”,而非“算法的设计者”。

随着学习的深入,如果你未来选择学习计算机科学,你会发现高中数学的很多知识点,如逻辑、代数运算、函数分析、离散数学等,都是计算机科学的基础。很多算法的实现,都需要扎实的数学功底去理解其背后的原理和优化方法。所以,虽然高中阶段没有“专门开设算法课”,但我们所学的数学内容,为理解和创造算法打下了重要的基础。这就像学习如何正确握笔写字、如何调色一样,是成为画家的基础步骤,但并不是直接在学习绘画的构图和意境。

换句话说,高中数学教给我们的是“解决问题的方法论和工具箱”,而这些方法和工具,本身就可以构成解决特定计算任务的“算法”基础。只是高中阶段的学习更注重“知其然并知其所以然”,而对算法的“高效性”和“通用性”的极致追求,则留给了更专业的学习领域。

网友意见

user avatar

你问了一个极好的问题。


高中数学其实确实技巧性强一些,但是初中和小学学的内容很多都是算法,只是没告诉你他叫 “算法” 而已。算法只是一系列操作而已。(你要是想问高中为啥不教数据结构和 之类的复杂度分析,那当我没说……)

初中的一元二次方程求根,一个方程拿来整理成 的形式,然后计算 , 再计算 . 很标准的算法。

二元一次方程组也差不多,方程组里的方程编号以后 消去 的系数,然后解出 再代回去算出 ,也是很标准的算法(这叫高斯消元法,据说《九章算术》里也有)。如果推广成 元一次方程组, 个方程 个变量,再假设总有解(矩阵可逆),你可以试试把高斯消元法的程序写出来,很多人写不对(输入 矩阵 和 向量 ,求 使得 ,无解的时候报错)。

多项式乘法,展开以后合并同类项然后降幂排列,也是很标准的,输入两个数组,输出一个数组。

小学的竖式乘法也是算法,输入两个整数(更准确地说是十进制表示下的字符串),然后如此这般,就能算出他们的乘积,输出乘积的十进制字符串表示(如果不需要写成十进制字符串的话,37 * 73 本身就是一个数字,为啥一定要写成 2701?)。你可以仔细想想怎么把这个东西写成一个算法。

如果一元二次方程求根是算法听起来有点强词夺理的话,小学学的竖式除法(带余除法)更是一个很像编程里面提到的那种算法,这里你不能一步得到答案,只能得到答案的最高位,剩下的过程是个递归…… 比如 100000 ÷ 7 写成竖式,先在万位上个 1,然后 10 - 7 = 3,其实说了两件事,从商的角度看 100000 ÷ 7 = 10000 + 30000 ÷ 7, 从余数的角度看,100000 % 7 = 30000 % 7. 这里这个算法并没有结束!你要继续把 30000 ÷ 7 计算下去。结束条件是最后剩下 5 ÷ 7,因为 5 < 7, 所以商是 0,余数是 5. 这完全就是让做除法的人执行一个程序而已。(竖式开平方也是类似的。)

如果你小学学过速算的话,你可能已经会优化算法了,比如 13 * 17 = 221, 有些速算会告诉你,因为 3 + 7 = 10, 所以只用计算 3 * 7 = 21 就能得到答案 221,同理 12 * 18 = 216,只需要一次一位数乘法(加上一个 if 判断语句)就得到答案,原来需要四次一位数乘法和若干次加法。

小学或者中学奥数还有个算法叫辗转相除法,这个可以追溯到欧几里得(Euclidean algorithm)。这也是一个递归的算法,为什么一定会终止,最坏情况(两个相邻的斐波那契数)算法需要执行多少步,都不是显然的。

不知道初中还学不学尺规作图,尺规作图里也集结了很多算法(比如要画角平分线,或者垂直平分线,总有给定的操作,但你总要详细说明)。

高中比较简单的一些内容也是算法,比如等比数列等差数列的求和(输入首项和公差,输出和)。你感觉不到高中有算法只是因为高考之类题目难一点,综合性变强而已。很多具体技巧,比如二次函数的配方,也是具体的算法(只是你对这些太熟悉了,是你脑子里的 inline 函数,感觉不到这里有个 “算法”)。


不过,你对初等数学教育的批评我认为是很有道理的,我认为至少应该强调一次 “算法” 的概念,也许以二元/三元一次方程组为例子,展示一个算法(即高斯消元法,类似这种:Gaussian elimination)。这种展示性质的内容不太适合高考出题(不可能在高考试卷上让人写个算法吧),但是对开拓眼界是有帮助的。只是在高考的背景下容易像复数一样被边缘化,被认为是 “没什么卵用” 的东西。[Edit: 刚听说高中课本真有介绍算法的概念,还有人告诉我课本上介绍了牛顿法用切线逼近方程的根,感觉很赞。我暴露年龄了]


看完这些你可能觉得我在胡扯,“排序才是算法”(或者算斐波那契数列才是?),那你需要补的是一些抽象的能力和离散数学的水平,高中如果有准备会有点帮助,但是也不会特别大。比如排序,可以拿一叠扑克牌来练练排序算法,自己执行一遍,把自己当成小学生操作一下就可以(最后你会发现 quicksort 或者 bucket sort 最快)。这块的抽象能力总是需要提升的,趁学算法的时候没坏处。

当然,大学里学的算法,跟初中高中差异最大的,可能是数据结构——人脑容量有限一般不会记住很多东西然后一样一样地处理,但计算机这方面不太一样,有时候可以先把数据搜集起来(比如弄个数组),再整理成适当的结构(e.g. build a min-heap, 做个小根堆),最后需要的时候再输出需要的东西(最小值)并保持住这个结构,这些确实高中没讲过,但可能也更适合有一定成熟性再学(还有些说起来不难但要靠计算机记住状态的东西,比如并查集,真不适合一般的高中生)。高中学的东西(或者偏数学里的东西),硬要说是算法的话,都是空间 的算法。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有