紙條摺痕問題
作者:Grey
原文地址:
題目描述
請把一段紙條豎着放在桌子上,然後從紙條的下邊向上方對摺1次,壓出摺痕後展開。此時摺痕是凹下去的,即摺痕突起的方向指向紙條的背面。如果從紙條的下邊向上方連續對摺2次,壓出摺痕後展開,此時有三條摺痕,從上到下依次是下摺痕、下摺痕和上摺痕。 給定一個輸入參數 N,代表紙條都從下邊向上方連續對摺 N 次。
請從上到下打印所有摺痕的方向。
例如:
N=1
時,打印down
;
N=2
時,打印:down down up
主要思路
本題主要是發現整個過程的規律,假設中間分割線看成是一個二叉樹的頭結點,分割線的上方看成是左子樹,分割線的下方看成是右子樹,則有如下規律
-
頭是凹摺痕
-
左子樹的頭節點都是凹摺痕
-
右子樹的頭節點都是凸摺痕
所以定義遞歸函數
void process(int i, int N, boolean down)
遞歸含義表示:從第 i 次摺疊後,紙條從上到下的佈局是如何,其中 N 是固定參數,表示 N 次摺疊,down 變量表示是否是凹摺痕,初始狀態調用
process(1, N, true);
表示:從第一次摺疊開始,摺疊了 N 次,紙條的狀態怎麼樣。
base case 就是
if (i > N) {
return;
}
普遍情況是
// 紙條上方的佈局情況,頭結點一定是凹摺痕
process(i + 1, N, true);
// 紙條分割線的情況
System.out.print(down ? "down " : "up ");
// 紙條下方的佈局情況,頭結點一定是凸摺痕
process(i + 1, N, false);
完整代碼見:
public static void printAllFolds(int N) {
process(1, N, true);
}
public static void process(int i, int N, boolean down) {
if (i > N) {
return;
}
process(i + 1, N, true);
System.out.print(down ? "down " : "up ");
process(i + 1, N, false);
}