折纸问题本质是用递归模拟二叉树中序遍历,i控制递归深度,n决定总折叠次数与树深,down标识当前折痕方向(左子恒true、右子恒false),三者协同实现“左凹右凸”的折痕序列生成。
折纸问题的本质,是用二叉树结构模拟纸条反复对折时折痕的生成顺序。它不真建树,而是靠递归调用隐式表达树的形态——关键在于理解 i、n 和 down 这三个变量各自承担的角色及其组合意义。
层数 i:代表当前“折叠动作”的深度
不是纸条的物理层数,而是递归中正在处理的第几次折叠。i = 1 表示第一次对折(根节点),i = 2 表示在已有折痕基础上再折一次(进入子树),以此类推。当 i > N 时,说明已超出总折叠次数,递归终止。这个变量控制递归边界,也对应二叉树的深度限制。
总次数 N:决定整棵树的规模与输出长度
N 是输入参数,固定不变,它决定了最终折痕总数为 2N − 1 条。同时,它也是递归树的最大深度。所有路径从根出发,最多向下走 N 层;每条从根到叶子的路径,恰好对应一次“折叠决策链”。N 越大,树越深,分支越多,输出序列越长。
方向标记 down:编码左右子树的身份特征
down 是布尔值,直接表示当前节点所对应折痕的方向:
• true → “down”(凹/下折痕)
• false → “up”(凸/上折痕)
它的取值不是随机的,而是由父节点位置决定:
• 根节点默认 down = true
• 所有左子节点继承 true(即左子树头结点恒为 down)
• 所有右子节点继承 false(即右子树头结点恒为 up)
这正是“左凹右凸”规律的程序化表达。
三者协同:一次调用 = 一个虚拟节点
每次 process(i, N, down) 调用,就等价于访问二叉树中的一个节点:
• 它知道自己在哪一层(i)
• 知道整棵树不能超过多深(N)
• 知道自己该输出什么方向(down)
而左右子树的访问,就通过两次递归调用自然展开:
– 先 call process(i+1, N, true) → 模拟进入左子树(无论当前是谁,左子必 down)
– 再输出当前方向
– 最后 call process(i+1, N, false) → 模拟进入右子树(右子必 up)
这种“左-根-右”的执行顺序,正是中序遍历的骨架。不需要指针、不需要存储节点,仅靠参数传递就完成了整棵树的逻辑遍历。










