紙條摺痕問題

紙條摺痕問題

作者:Grey

原文地址:

博客園:紙條摺痕問題

CSDN:紙條摺痕問題

題目描述

請把一段紙條豎着放在桌子上,然後從紙條的下邊向上方對摺1次,壓出摺痕後展開。此時摺痕是凹下去的,即摺痕突起的方向指向紙條的背面。如果從紙條的下邊向上方連續對摺2次,壓出摺痕後展開,此時有三條摺痕,從上到下依次是下摺痕、下摺痕和上摺痕。 給定一個輸入參數 N,代表紙條都從下邊向上方連續對摺 N 次。
請從上到下打印所有摺痕的方向。
例如:
N=1時,打印down;
N=2時,打印:down down up

主要思路

本題主要是發現整個過程的規律,假設中間分割線看成是一個二叉樹的頭結點,分割線的上方看成是左子樹,分割線的下方看成是右子樹,則有如下規律

  1. 頭是凹摺痕

  2. 左子樹的頭節點都是凹摺痕

  3. 右子樹的頭節點都是凸摺痕

所以定義遞歸函數

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);
  }

更多

算法和數據結構筆記

參考資料

算法和數據結構體系班-左程雲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章