Java 謎題 2:夢境
你有沒有從夢中醒來,然後發現你真的還在做夢?如果你醒來,你怎麼知道你回到了現實?這個難題實現了該問題的解決方案:當您進入和退出夢想時,您可以計算夢境的遞迴級別:
package sleep; import dream.Dream; public class Sleeper { private int level; public synchronized int enter(Dream dream) { level++; try { dream.dream(this); } finally { level--; } return level; } } |
睡眠者開始睡覺並進入夢境(第一級)。他可以在夢裡做一個夢,甚至進入更深層次的夢。但當他離開表層的夢時,他再次醒來,所以他應該再次回到零級,對吧?
package sleep; import dream.Dream; public class Main { public static void main(String[] args) { if (new Sleeper().enter(new Dream()) != 0) { // The goal is to reach this line System.out.println("Am I still dreaming?"); } } } |
levels 計數看起來非常安全,所以這似乎是不可能的:
- 每次進入夢境level都會增加。由於finally阻擋,沒有辦法離開夢境而不再減少它。
- synchronized塊確保沒有其他執行緒可以同時呼叫它。從夢的方法返回級別,以確保它在synchronized塊內讀取。
- 進入夢境時lever必須是零,那麼從它返回的值也必須為零,因為即使我們遞迴地呼叫它,我們也必須輸入與退出同樣多的夢境。
// this is the only file you're allowed to edit package dream; import sleep.Sleeper; public class Dream { public void dream(Sleeper s) { // TODO implement me } } |
你能找到這個推理中的缺陷嗎?你能想象一個真正奇怪的夢想會讓睡眠者失去理智嗎?
相關文章
- 除法謎題(2)
- 平方謎題(2)
- Java謎題:小丑Java
- 乘法◆除法◆謎題(2)
- ●六數謎題●(2)
- Java謎題5:球(ball)Java
- Java謎題3:汽車Java
- Java謎題6:雞與蛋Java
- Java 謎題 7:餅乾(Cookie)JavaCookie
- Java 謎題4:液體(Liquid)JavaUI
- 加法、乘法、除法:綜合謎題(2)
- Java謎題1:小丑 - 解決方案Java
- Java謎題7:餅乾-解決方案Java
- Java謎題5:球(ball)-解決方案Java
- Java謎題3:汽車 - 解決方案Java
- Java謎題6:雞與蛋-解決方案Java
- 夢境結構
- Java基礎教程(2)--Java開發環境Java開發環境
- 解謎遊戲謎題設計研究(三):推理類謎題設計遊戲
- 解謎遊戲謎題設計研究(一):物品類謎題設計遊戲
- 解謎遊戲謎題設計研究(二):機關類謎題設計遊戲
- ●1/2, 2/3, 3/4, 4/5, 5/6, 7/6構成的謎題●(2)
- 魔法塔之謎(2)
- 除法謎題(1)
- 平方謎題(15)
- 平方謎題(10)
- 平方謎題(11)
- 平方謎題(9)
- 平方謎題(13)
- 平方謎題(14)
- 平方謎題(16)
- 平方謎題(12)
- 平方謎題(7)
- 平方謎題(6)
- 平方謎題(8)
- 平方謎題(1)
- 平方謎題(5)
- 平方謎題(4)