Определения типов рекурсивных функций

Я немного смущен тем, что здесь происходит с этим определением рекурсивного типа:

type Func func() (int, int, Func)

Примечание. Я знаю, как использовать его методом проб и ошибок, но я очень не уверен, что это такое (определение рекурсивного типа).

package main

import "fmt"

func fib(x int) int {
    if x == 0 {
        return 0
    } else if x == 1 {
        return 1
    } else {
        return fib(x-1) + fib(x-2)
    }
}

type Func func() (int, int, Func)

func get_fib(x int) (int, int, Func) {
    return x, fib(x), func() (int, int, Func) { return get_fib(x + 1) }
}

func main() {
    d, n, f := get_fib(10)
    d1, n1, f1 := f()
    d2, n2, _ := f1()
    fmt.Println(d, n)
    fmt.Println(d1, n1)
    fmt.Println(d2, n2)
}

Может ли кто-нибудь пролить свет на то, что создано в приведенном выше определении рекурсивного типа?

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

тип Func func() (int, int, Func) — это просто тип функции, имя типа которого — Func. Вы можете рассматривать его как анонимную функцию с нулевым параметром и 3 возвращаемыми значениями (и последнее возвращаемое значение также является типом Func).

При назначении некоторой переменной этому типу функции (Func) эта переменная будет именем этой функции. Затем вы можете вызвать функцию с именем переменной в качестве имени функции.

В приведенном выше коде d, n, f := get_fib(10), d получить 10, n получить fib(10), fu получить func() (int, int, Func) { return get_fib(11) }. Затем вы можете вызвать f(), который вернет результат get_fib(11) напрямую.

================================================== ============

Зачем нужен рекурсивный тип для создания этой функциональности:

Просто мои мысли: функция get_fib хочет вернуть три результата: x, вход функции fib (тип int), результат функции fib (тип int), функция для возврата функции get_fib(x+1) (тип func , а не Func сейчас). (Поэтому get_fib также является своего рода рекурсивным, потому что он использует get_fib в своем возвращении.) Поскольку функция (с типом func, а не Func now) возвращает get_fib(x+1), типы возвращаемых значений которого такие же, как у get_fib(x), . Таким образом, типы возвращаемых функций должны быть int, int, func (func — это третий результат в возврате get_fib, который является самим определением функции). Поэтому необходим рекурсивный тип функции.

Вкратце:

  • Вывод get_fib (int, int, customfunc)
  • Вывод customfunc (get_fib), который равен (int, int, customfunc) очередной раз.
  • Таким образом, вывод customfunc (int, int, customfunc) является типом рекурсивной функции.

Спасибо за ответ, Жор, но я думаю, что вы привели мне пример использования, а не то, почему рекурсивный тип нужен для создания этой функциональности. Насколько я понимаю, вам нужно создать этот рекурсивный тип для создания этой функциональности, и это то, что я ищу. Что этот тип достигает и как... Может быть, я слишком усложняю рекурсивный тип.

G4143 09.04.2022 05:15

Я добавил свои мысли к своему ответу. Не уверен, что они касаются вашего вопроса.

Cyril Zhou 09.04.2022 08:24

Итак, рекурсивный тип необходим, чтобы дать имя рекурсии?

G4143 09.04.2022 10:58

Я не уверен, что такое «имя рекурсии», на которое вы ссылаетесь. Мое понимание определения рекурсивного типа в golang таково: определите тип с некоторым именем и используйте то же имя в определении типа. Например, введите RecurStuct struct{field *RecurStuct}. Поле, определенное рекурсивно, должно быть некоторым значением указателя.

Cyril Zhou 09.04.2022 11:40

В вашем примере (пример в вашем комментарии) вы назвали тип, который используется в/для рекурсивной структуры данных. Без этого явного именования типа вы могли бы определить рекурсивную структуру данных?

G4143 09.04.2022 13:22

Нет, я не могу. Я думаю, что явное имя типа необходимо для ссылки в определении типа для создания рекурсивной структуры данных. Определение типа рекурсивной функции в вашем сообщении «type Func func() (int, int, Func)» также имеет явный тип с именем «Func».

Cyril Zhou 10.04.2022 04:02

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