折纸问题
程序员文章站
2024-01-15 12:49:52
...
折纸问题
题目
请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面.如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕,下折痕和上折痕。给定一个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向.例 如 :
N =1时,打印 : down
N=2时,打印 : down down up
解析
可以用一张纸条自己折一下,会发现:
- 第一次折的时候,只有一条折痕,往里凸的,记为1down。
- 第二次折的时候,发现1down的上方为往里凸,记为2down,而下方为往外凸,记为2up。
- 第三次折的时候,发现2dowm的上方往里凸,记为3down,2down的下方往外凸,记为3up; 而2up的上方往里凸,记为3down,2up的下方往外凸,记为3up;
从上面折痕可以发现新的折痕的上面总是为down,下面总是为up,所以我们可以构造出一颗二叉树,具体看下图
所以当前结点左子树总是down(true),右子树为up(false),所以我们只要按照中序遍历这颗二叉树就解决问题了。
public class PaperFloding {
//打印的所有折痕方向的函数
public static void printAllFolds(int N){
printProcess(1,N,true);// 根节点的是down(第一次折的时候是往下的(往里凸))
}
private static void printProcess(int i, int N, boolean down) {
if(i > N){ //终止条件(相当于结点为null)
return;
}
printProcess(i+1,N,true);// 相当于往左子树跑(因为左子树永远是down(下))
System.out.println(down ? "down " : "up "); //访问中间
printProcess(i+1,N,false); //往右子树跑
}
public static void main(String[] args) {
int N = 3;
printAllFolds(N);
}
}
n = 3的测试结果