一百万节点的链别用递归数
下面用递归数一条一百万个节点的链有多长,原样运行会爆栈。把 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
给斐波那契加上记忆
补全 fib:算之前先查 memo,算完之后存进 memo。算 fib(30)。 (本题用 g++ -std=c++17 -O0 编译。)
数一数记忆化之后调了几次
下面的 fib 把计数写在了查表之前,命中缓存也被算了进去。把计数挪到查表之后,算 fib(6),输出 calls。 (本题用 g++ -std=c++17 -O0 编译。)
记忆化到底省了多少
朴素版已经写好。补全记忆化版 fib_memo(命中不计数),各算一次 fib(20),把两个调用次数用 / 拼起来输出(朴素在前)。 (本题用 g++ -std=c++17 -O0 编译。)
记忆化不能改变结果
两个版本都写好了。比较两者对 fib(20) 的结果:一样输出 结果一致,否则输出 结果不一致。 (本题用 g++ -std=c++17 -O0 编译。)