swift版本
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
Swift的枚舉可以定義為遞歸袭厂,即對于有關聯(lián)值(Associated Values)的枚舉項,其關聯(lián)值可以是枚舉類型自身饭入。
遞歸枚舉通常用帶switch的遞歸來處理嵌器,下面給出一個漢諾塔的例子。
這個例子我不是特別滿意谐丢,因為它是純粹為展示用法而寫的例子爽航,不用遞歸枚舉,實現(xiàn)起來反而更簡潔乾忱。
具體說明參見代碼注釋讥珍。
enum HanoiMove {
//最后一步
case OneStepMove(起點: Character, 終點: Character)
//嵌套步,與CombinationMove一起發(fā)揮作用
case MultiStepMove(起點: Character, 經(jīng)由: Character, 終點: Character)
//CombinationMove里面嵌套了一個HanoiMove的參數(shù)窄瘟。從實現(xiàn)邏輯上講衷佃,這層嵌套沒有必要,僅需使用MultiStepMove即可
indirect case CombinationMove(方案: HanoiMove, 數(shù)量: Int) //遞歸枚舉值前必須要加關鍵字indirect
//初始化
case InitialStatus(數(shù)量: Int)
}
func performMove(_ thisMove: HanoiMove) {
switch thisMove {
case let .OneStepMove(起點: origin, 終點: destination): //這里的let也可以分成兩個蹄葱,放在orgin和destination前面
print("\(origin)->\(destination)")
//走到MultiStepMove氏义,必然是number=2
case let .MultiStepMove(起點: origin, 經(jīng)由: via, 終點: destination):
performMove(.OneStepMove(起點: origin, 終點: via))
performMove(.OneStepMove(起點: origin, 終點: destination))
performMove(.OneStepMove(起點: via, 終點: destination))
case let .CombinationMove(HanoiMove, 2):
performMove(HanoiMove)
case let .CombinationMove(.MultiStepMove(起點: origin, 經(jīng)由: via, 終點: destination), number):
performMove(.CombinationMove(方案: .MultiStepMove(起點: origin, 經(jīng)由: destination, 終點: via), 數(shù)量: number - 1))
performMove(.OneStepMove(起點: origin, 終點: destination))
performMove(.CombinationMove(方案: .MultiStepMove(起點: via, 經(jīng)由: origin, 終點: destination), 數(shù)量: number - 1))
case let .InitialStatus(數(shù)量: number):
performMove(.CombinationMove(方案: .MultiStepMove(起點: "A", 經(jīng)由: "B", 終點: "C"), 數(shù)量: number))
break
default:
break
}
}
performMove(.InitialStatus(數(shù)量: 4))
打印結(jié)果
A->B
A->C
B->C
A->B
C->A
C->B
A->B
A->C
B->C
B->A
C->A
B->C
A->B
A->C
B->C