美文网首页
用递归枚举(Recursive Enumerations)实现汉

用递归枚举(Recursive Enumerations)实现汉

作者: 阿影 | 来源:发表于2016-12-18 23:58 被阅读48次

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

相关文章

网友评论

      本文标题:用递归枚举(Recursive Enumerations)实现汉

      本文链接:https://www.haomeiwen.com/subject/xybzmttx.html