五万层递归也能跑完
每层栈帧很小时,几万层递归还放得下。运行下面这段程序: #include <algorithm> #include <iostream> #include <numeric> #include <s
自己拿个栈算阶乘
下面用 vector 当栈,模拟阶乘递归的「往下压、往回乘」。运行下面这段程序: #include <algorithm> #include <iostream> #include <numeric> #
一千万层的求和改成循环
下面的 sum_to 用递归求 1 + 2 + … + n。n = 一千万时,原样运行会把栈压爆(段错误)。把它改成循环累加,输出结果。 (本题用 g++ -std=c++17 -O0 编译。)
大数组搬到函数外面
下面在 main 里开了一个 400 万个 int 的局部数组(约 16 MB),原样运行会因为栈放不下而崩溃。把数组挪到函数外面(全局变量不占栈),输出所有元素之和。 (本题用 g++ -std=c++17 -O0 编译。)
一百万节点的链别用递归数
下面用递归数一条一百万个节点的链有多长,原样运行会爆栈。把 length 改成循环,输出长度。 (本题用 g++ -std=c++17 -O0 编译。)
深树的遍历自己拿个栈
一棵树退化成了一百万层的链,递归遍历会爆栈。把 count_dfs 改成用 vector 当栈的循环写法,数一数有几个节点。 (本题用 g++ -std=c++17 -O0 编译。)
倒着收集也别递归
下面的 back_collect 用递归把一百万个数倒着收集起来——原样运行会爆栈。改成循环,输出收集到的前五个,用 / 连起来。 (本题用 g++ -std=c++17 -O0 编译。)
记忆化在做什么
第 1 步:从 fib(4) 开始 第 2 步:先沿左边算下去 第 3 步:第一次算 fib(2):记下结果 第 4 步:fib(2) 存进表里 第 5 步:右边又要 fib(2):直接查表 第 6 步:它下面不用再拆了 f4 f3 f2
什么样的递归值得记忆化(C++)
记忆化只在【0】的时候有用。
记忆化之后只调用几次
给斐波那契加上记忆化:memo 里填 -1 表示还没算过。运行下面这段程序: #include <algorithm> #include <iostream> #include <numeric> #in