Свифт: Как это создает двоичное дерево? - PullRequest
0 голосов
/ 02 мая 2018

Итак, я слежу за онлайн-уроком и понимаю все, кроме этой части. Человек объясняет мне, что это создает бинарное дерево, так сказать, где один элемент связан с двумя элементами. В этом случае страница связана с двумя страницами. Я не понимаю, как это работает в этом примере, где struct Adventure создает двоичное дерево. Любая помощь будет оценена. В настоящее время я чувствую себя очень плохо из-за того, что вообще ничего не понимаю.

import Foundation

class Page {
    let story: Story

    typealias Choice = (title: String, page:Page)

    var firstChoice: Choice?
    var secondChoice: Choice? 

    init(story: Story) {
        self.story = story
    }
}

    extension Page {
// adds the page
        func addChoiceWith(title: String, story:Story) -> Page {
            let page = Page(story:story)
            return addChoiceWith(title: title, page: page)
        }

// creates branches
        func addChoiceWith(title: String, page: Page) -> Page {
            switch (firstChoice, secondChoice) {
            case (.some, .some) : return self
            case (.none, .none), (.none, .some): firstChoice = (title, page)
            case (.some, .none): secondChoice = (title,page)

            }

            return page
        }
    }


    struct Adventure {
        static var story: Page {
            let returnTrip = Page(story: .returnTrip)
            let touchdown = returnTrip.addChoiceWith(title: "Stop and Investigate", story: .touchDown)
            let homeward = returnTrip.addChoiceWith(title: "Continue home to Earth", story: .homeward)
            let rover = touchdown.addChoiceWith(title: "Explore the Rover", story: .rover)
            let crate = touchdown.addChoiceWith(title: "Open the Crate", story: .crate)

            homeward.addChoiceWith(title: "Head back to Mars", page: touchdown)
            let home = homeward.addChoiceWith(title: "Continue Home to Earth", story: .home)

            let cave = rover.addChoiceWith(title: "Explore the Coordinates", story: .cave)
            rover.addChoiceWith(title: "Return to Earth", page: home)

            cave.addChoiceWith(title: "Continue towards faint light", story: .droid)
            cave.addChoiceWith(title: "Refill the ship and explore the rover", page: rover)

            crate.addChoiceWith(title: "Explore the Rover", page: rover)
            crate.addChoiceWith(title: "Use the key", story: .monster)

            return returnTrip
        }
    }

1 Ответ

0 голосов
/ 02 мая 2018

Каждый Page представляет узел в дереве, а каждый Choice представляет ветвь. A Story похоже на содержимое узла. firstChoice.page и secondChoice.page представляют двух дочерних элементов узла.

Свойство Adventure.story создает дерево и возвращает корневой узел. Вы можете получить доступ ко всем другим узлам, используя корень:

Adventure.story.firstChoice.page.secondChoice.page

Теперь давайте посмотрим, как построено дерево. Обратите внимание, что это не стандартное двоичное дерево, которое вы видите все время. Некоторые из узлов имеют своих родителей в качестве детей. Но у каждого узла есть двое детей.

Я превращу код в псевдокод. Вы можете следовать этому коду, а на листе бумаги нарисовать дерево самостоятельно.

Create a node called "returnTrip"
Add a child to returnTrip called "touchDown"
Add a child to returnTrip called "homeward"
Add a child to touchDown called "rover"
Add a child to touchDown called "crate"
Connect homeward back to touchDown
Add a child to homeward called "home"
Add a child to rover called "cave"
Connect rover to home
Add a child to cave called "droid"
Connect cave to rover
Connect crate to rover
Add a child to crate called "monster"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...