swift版本
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
Swift的枚举可以定义为递归,即对于有关联值(Associated Values)的枚举项,其关联值可以是枚举类型自身。
递归枚举通常用带switch的递归来处理,下面给出一个汉诺塔的例子。
这个例子我不是特别满意,因为它是纯粹为展示用法而写的例子,不用递归枚举,实现起来反而更简洁。
具体说明参见代码注释。
enum HanoiMove {
//最后一步
case OneStepMove(起点: Character, 终点: Character)
//嵌套步,与CombinationMove一起发挥作用
case MultiStepMove(起点: Character, 经由: Character, 终点: Character)
//CombinationMove里面嵌套了一个HanoiMove的参数。从实现逻辑上讲,这层嵌套没有必要,仅需使用MultiStepMove即可
indirect case CombinationMove(方案: HanoiMove, 数量: Int) //递归枚举值前必须要加关键字indirect
//初始化
case InitialStatus(数量: 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, 经由: 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, 经由: via, 终点: destination), number):
performMove(.CombinationMove(方案: .MultiStepMove(起点: origin, 经由: destination, 终点: via), 数量: number - 1))
performMove(.OneStepMove(起点: origin, 终点: destination))
performMove(.CombinationMove(方案: .MultiStepMove(起点: via, 经由: origin, 终点: destination), 数量: number - 1))
case let .InitialStatus(数量: number):
performMove(.CombinationMove(方案: .MultiStepMove(起点: "A", 经由: "B", 终点: "C"), 数量: number))
break
default:
break
}
}
performMove(.InitialStatus(数量: 4))
打印结果
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