当前课程知识点:程序设计基础 > 第五章 分治思想与递归 > 5.1 阶乘 > 5.1.2 递归解法
好了 我们现在看第三个公式
第三个公式很神奇 它是这么写的
它是根据 第三个公式的实现的函数
看上去有点奇怪 它是这么来写的
因为你公式里头写的是说
n的阶乘等于什么呢
等于n乘上n-1的阶乘
那这个意思就有点像是说
你要去求n的阶乘 很好办呀
你就把n拿过来 去乘上
乘上n-1的阶乘
可是n-1的阶乘在哪里呢
这个时候我们不去用上面那个方法
说n-1的阶乘前面已经算过了 不是的
此时此刻就当作我们就要算n的阶乘
可是公式告诉我们
n的阶乘是用n乘上n-1的阶乘算出来的
那n-1的阶乘我还没算呢 没关系
你现在不正在编写求阶乘的函数吗
这个函数的功能就能够把一个
输入的值算出它的阶乘出来
那么对于n-1的阶乘这样一个值
你直接调这个函数不就行了么
所以大家看到的代码就变成这个样子
在这个函数里头 有一个
return语句写的是n!的结果
怎么算出来的呢
是n乘上对它自己的一个调用
fact这个函数 n-1作为参数
用这个函数来实现n-1的阶乘
那于是这个地方就有点奇怪了
在实现这个阶乘fact这个函数的时候
它里面的语句用到了对它自身的一个调用
那么这个里头 要理解这一点
就要要求大家对我们前面所讲的
函数的一个概念要有一个深刻的认识
也就是 函数它完成了把输入进行处理
最后输出结果 这样的一个功能
所以在这样一个语句里
应该把它理解为我用一个fact函数
去解决了n-1的阶乘的求解
把这个结果拿过来跟n乘
就是我们现在要求的n的阶乘的结果
我return给你 这个话逻辑上叙述是没有问题的
那这是如何来理解这个部分
关键大家对于函数是不是理解透彻了
要把它想象成一个黑匣子 有输入有输出
至于里头到底怎么实现的 不用管它
就像我们现在用sin cos
大家在前面做习题的时候
自己练习的时候 可能调用过数学函数
你什么时候关心过这函数到底怎么来实现的
你不也用的好好的吗 这个道理也是一样
好 在这个里头我们发现
在fact调用的时候 它的参数
由原来的n变成了n-1 那么这个过程
很显然是可以不断的进行下去的
不断的把这个规模给它缩小
什么时候能终止呢
我们可以看到在这个函数里头
多了一个特殊的东西
就是最前面的一个if的判断语句
这个判断语句告诉我们 当n等于1的时候
对不起 你就直接可以返回阶乘的结果
而不要再去调用函数了 因为人脑袋知道
所以n等于1的时候直接返回它的阶乘结果是1
而当n不等于1呢 那就用公式来算
用n去乘上小一点的n-1的这个结果的阶乘
那我们分析刚才这样一个程序的执行的过程
我们可以想象一下 为了去求3的阶乘
我们要去求2的阶乘 为了去求2的阶乘呢
又要去求1的阶乘 而1的阶乘已经有了
我们代码里面已经写了 当n等于1的时候
它就直接返回1了 这个过程啊
很有点像是在剥一个圆白菜
从外往里一层层去剥开它
到了菜心就遇到1了 就求解了呀
1的阶乘知道呀 就返回了
然后用公式 n的阶乘等于n乘上n-1的阶乘
用这个式子 你就可以外推回去
依次得到3的阶乘
那这样一个过程 它的外层和内层
有相同的结构 实际上是一种
你中有我 我中有你的一种关系
呈现出一种相互依赖关系
我们把这样一种函数的实现
称之为是一种递归函数
用这种函数思想去解决的问题
我们称之为是运用了递归的算法
递归算法的出发点不是在初始条件上
而是在求解的目标上面 也就是说
从一个未知的项出发
逐次的去调用它自身 因为所谓自身就是
同名的函数 像我们刚才例子里头是fact
依次去调用它 最后得到最终的解
当然依次调用的时候最后达到的边界条件
对于我们来讲 是1的阶乘 这是已知的
达到一个已知的这个终止条件之后就停止
这样的求解过程是称之为递归的算法思想
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测