Swift: как это создает двоичное дерево?

Итак, я следую онлайн-руководству и понимаю все, кроме этой части. Человек объясняет мне, что это создает двоичное дерево, так сказать, где один элемент связан с двумя элементами. В этом случае страница связана с двумя страницами. Я не понимаю, как это работает в этом примере, где 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
        }
    }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждый Page представляет узел в дереве, а каждый Choice представляет ветвь. 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"

Итак, правильно ли я предполагаю, что каждый выбор (ветвь) - это просто ссылка на свойство на другую страницу.

Curt Rand 02.05.2018 15:13

@CurtR и в основном так и есть, но с title, который можно представить как маркировку линии, соединяющей два узла.

Sweeper 02.05.2018 15:14

Другие вопросы по теме