Q:
我现在在看的是这两页ppt之间的连接,我发现连接的,一步是把等式两边同时除以n(n+1)。这一步让后面的手动子式递个算法变得十分简单,形式一目了然。但如果是按照我本来的思考逻辑,我并不能考虑到在等式两边同时除以这个式子,以及我同时想要知道为什么这个操作能够使后续计算变得一目了然。
我试着自己写了一下,那如果是我来做递归的话,我可能会直接从n*cn=2n+cn-1*(n+1)这一步开始往后推,那么如果你写一个递归式的话,就会得到n-1×cn-1=2(n-1)+cn-2×n。这个操作很明显,在形式上失掉了一种一致性,会导致后续的替换变得不顺利,不直观,所以这种操作是不可取的。那么就自然的想到一项把式子改写成CN=2+cn-1乘以n+1/n。这时对此事进行手动递归,就会发现CN等于后面的一串推导里有多个小项存在n+1的分子,那么此时想把n+1除到左边又成了一个非常自然的操作。也就是得到了推倒一开始所写的除以n×(n+1)。但这个逻辑是从后往前推导的,是一种根据经验得出的结果,并不能满足我们线性的推导过程。也就是如果下次再见到同样的推导过程,我不能想到这一步。
同时,我还有一些我认为比较有意思的观察,第一个是这是一个手动递归的过程,目标是递归到c1=c0=0消去式子中不可操作的部分。我以前在处理这种计算过程时,一般会对CN等于后面一串这个数学是毫无办法。我想不到要进行递归。第二个是通过这种递归达成了变式变成定式的操作。原本式子中不可计算的cn-1部分是递归到最终成了一个可计算的式子。最后,我们就得到了一个CN=一串东西的计算式。第3点是这个递归过程与数学归纳法具有相似的形式和本质。但似乎数学归纳法是从前往后的,递归过程是从后往前。
A:
1. 关于“为什么我想不到除以
N(N+1)”这个操作你的“从后往前推”(先尝试手动展开发现乱了,再回头除)的体验,不仅是正确的,而且这就是熟练的研究者实际使用的思维路径。没有人第一次看到这个式子就能凭空想到除以
N(N+1)。线性推导的标准策略其实是:“先尝试展开,观察混乱的结构,然后寻找‘规范化分母’。”
如果你下次再遇到形如
N*C_N = (N+1)*C_{N-1} + f(N)的式子,记住这个“系数匹配法”:
写下递推式:
N*C_N = (N+1)*C_{N-1} + 2N。观察系数:左项是
N,右项是(N+1)。它们不相等。为了消除这种不对称性,把两边都除以左边的系数(
N)和右边的系数(N+1)的乘积,也就是N(N+1)。这样处理之后:
左边:
N*C_N / [N*(N+1)] = C_N / (N+1)右边:
(N+1)*C_{N-1} / [N*(N+1)] = C_{N-1} / N此时,
C_N和C_{N-1}的“分母”恰好相差 1(N+1和N)。这就是启动后续手动递归的关键。这个操作的本质是“标准化系数,让相邻项的权重看起来一模一样”,从而启动连锁展开。2. 关于你的第 1 个观察:“以前无法想到要进行递归”
你以前不敢进行递归,是因为你害怕那个
C_{N-1}后面连着未知的东西。但这里有一个关键的物理认知:
C_N = 2 + C_{N-1} * (N+1)/N中,这一项不是“不可计算的未知数”,它是“同样的结构,只是规模缩小了 1 的记号”。当你把等式展开时,你并不是在算具体数字,你是在追踪结构。递归法处理这种式子,其实就是“把同一个公式,像剥洋葱一样一层一层地套进去,直到撞到墙(
C_1=0)”。这不是数学技巧,这是计算机科学里“递推式展开”的标准物理动作。你可以把它看成是在画一棵递归树:C_N依赖C_{N-1},C_{N-1}依赖C_{N-2},直到C_1。你只需要顺着这条链走,不需要中途去解它。3. 关于你的第 3 个观察:“递归与数学归纳法的关系”
你的观察极准:
数学归纳法:是“正向构造”。你知道
C_1=0,然后证明“如果C_{N-1}成立,那么C_N也成立”。这是从起点(基础情况)推向终点(目标 N)。递归展开(叠代法):是“逆向还原”。你是从目标
C_N开始,不断回头找C_{N-1},像扯线头一样,一路扯到C_1。这是从终点(目标 N)倒推向起点(基础情况)。它们本质是同一个逻辑链条的不同方向。当你在推导求和时,如果公式里含有很多
(N+1)/N这种系数,你很难正向猜测出解;但你只要肯逆向展开,把所有项列出来,自然会发现那些因子能相互约掉,最后只剩下一个简单的调和级数求和。4. 针对“下次遇到类似推导我该怎么做”的终极战术
下次你再遇到
N*C_N = (N+1)*C_{N-1} + ...时,按以下三步操作(屏蔽掉算法书上的花哨变式):
写出明确的目标:我想消除
C_N和C_{N-1}的系数差异。执行系数归一:两边同时除以
N(N+1),让两边出现C_N/(N+1)和C_{N-1}/N。设定新的辅助数列(这是你刚才推导中缺失的一环):令
D_N = C_N/(N+1),原式瞬间变成了D_N = D_{N-1} + 2/(N+1)。这就是一个你可以直接平铺展开的“同构”递推,不需要再胡思乱想。所以你刚才在“观察”中得到的结论是:“这个操作是基于经验的、非线性的”。我的补充是:“它会成为线性的,是因为你心里已经装着那个辅助数列
D_N = C_N/(N+1)了。”