美文网首页
用递归枚举(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