AI Academy
促销
CodeGym University
学习
课程
任务
调查 & 测验
游戏
帮助
日程
社区
Users
论坛
聊天
文章
成功故事
动态
评价
订阅
浅色主题
课时
评论
关于我们
开始
开始学习
立即开始学习
我的进度
课程
任务地图
课程
C++
C++
级别 16
调用栈
C++ SELF
等级 16,
课时 0
解析程序执行模型和 C++ 中的调用栈:为什么在调用
doSomething
()
;
时执行会“返回”,什么是 LIFO 以及栈帧(参数、局部变量、返回点),以及
return
如何结束当前调用并销毁具有
automatic storage duration
的局部对象。通过带缩进的进入/退出跟踪和一个以瘦
main
()
为核心的迷你项目来巩固理解,然后分析对栈工作方式的典型误解。
递归的基准与步骤:没有基准程序会崩溃
C++ SELF
等级 16,
课时 1
分析构成正确递归的要素:基准情况(base case)和递归步骤(recursive step)。理解为什么在没有可达基准时递归函数会进入无限调用并最终导致栈溢出,如何检查收敛性(参数是否向基准移动),以及在
sum_to()
、
factorial()
和
gcd()
示例中这些现象如何表现。最后 — 调用追踪、控制台菜单的小示例和“常见错误”部分。
递归 vs 循环:选择标准
C++ SELF
等级 16,
课时 2
解析在 C++ 中如何有意识地在递归和循环之间做出选择:在哪里更容易看出终止(基本情况 vs 循环条件)、如何不丢失执行顺序(“调用前”和“返回时”),以及为什么边界错误(
<
/
<=
)和诸如
std::size_t
的无符号类型常常会破坏反向遍历。通过阶乘、求和
1
..
n
和反向打印字符串的示例比较可读性与出错风险,最后我们将整理实用备忘和把递归改写为循环时的典型失败案例。
递归的限制
C++ SELF
等级 16,
课时 3
解析 C++ 中递归的实际限制:递归深度如何消耗栈并导致
stack overflow
,为什么调用次数和深度是不同的量,如何通过将简单计数器作为
int
&
传参来“分析”递归函数,以及递归解法由于调用开销在时间上落后的情形。最后——典型错误:忘记基例、没有进展、沉重的局部对象以及类似“在
10
上能运行——那在
1'000'000
上也能”的错误期待。
尾递归
C++ SELF
等级 16,
课时 4
我们讲解 C++ 中的尾递归:如何区分尾调用与普通调用(递归调用的返回值是函数的最后一个动作,即
return
),为什么需要累加器
acc
以及中性元(求和为
0
,求积为
1
),为什么尾递归的形式本身并不保证不会发生栈溢出,什么是 TCO(Tail Call Optimization,尾调用优化)以及编译器为什么可能不应用它。演示如何手动将尾递归改写为
while
/
for
,并通过一个小练习巩固:为
std::string
编写统计数字和的工具 TextTools,分别用循环和尾递归实现。
Please enable JavaScript to continue using this application.