一、题目
取出一张纸,使纸张的正面始终面向自己,向上对折,所得到的第一个折痕标记为凹,反之其余情况的折痕为凸。
设折叠次数为N次,求折叠N次之后,由上往下折痕的顺序。
样例:
N=1
折痕顺序为
凹
N=2
折痕顺序为
凹凹凸
二、题解
(1)原理
第一次折叠之后,得到的折痕标记为1凹,折叠第二次之后,观察发现,在1凹的上方与下方分别得到两个新的折痕,其中上方标记为2凹,下方标记为2凸,折叠第三次之后,观察发现,在2凹与2凸的上方与下方分别出现两个新的折痕,分别标记为3凹,3凸,3凹,3凸。
由上述规律总结之后得出,可以将折痕的凹凸记录为:根节点为凹,左子树的根节点为凹,右子树的根节点为凸的一个满二叉树。从上往下所得到的折痕的凹凸顺序为该满二叉树的中序遍历的结果。
如图:
(2)代码
public class PaperFolding {
// 微软折痕题(凹凸)
public static void printAllFolds(int N) {
printProcess(1, N, true);
}
// 递归过程,来到了某一个结点
// i是结点的层数,N是一共的层数,down == true 表示凹 down == true 表示凸
public static void printProcess(int i, int N, boolean down){
if (i > N) {
return;
}
printProcess(i+1, N,true);
System.out.println(down ? "凹" : "凸");
printProcess(i+1, N, false);
}
public static void main(String[] args) {
int N = 3;
printAllFolds(N);
}
}