Я немного смущен тем, что здесь происходит с этим определением рекурсивного типа:
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)
}
Может ли кто-нибудь пролить свет на то, что создано в приведенном выше определении рекурсивного типа?
тип 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, который является самим определением функции). Поэтому необходим рекурсивный тип функции.
Вкратце:
Я добавил свои мысли к своему ответу. Не уверен, что они касаются вашего вопроса.
Итак, рекурсивный тип необходим, чтобы дать имя рекурсии?
Я не уверен, что такое «имя рекурсии», на которое вы ссылаетесь. Мое понимание определения рекурсивного типа в golang таково: определите тип с некоторым именем и используйте то же имя в определении типа. Например, введите RecurStuct struct{field *RecurStuct}. Поле, определенное рекурсивно, должно быть некоторым значением указателя.
В вашем примере (пример в вашем комментарии) вы назвали тип, который используется в/для рекурсивной структуры данных. Без этого явного именования типа вы могли бы определить рекурсивную структуру данных?
Нет, я не могу. Я думаю, что явное имя типа необходимо для ссылки в определении типа для создания рекурсивной структуры данных. Определение типа рекурсивной функции в вашем сообщении «type Func func() (int, int, Func)» также имеет явный тип с именем «Func».
Спасибо за ответ, Жор, но я думаю, что вы привели мне пример использования, а не то, почему рекурсивный тип нужен для создания этой функциональности. Насколько я понимаю, вам нужно создать этот рекурсивный тип для создания этой функциональности, и это то, что я ищу. Что этот тип достигает и как... Может быть, я слишком усложняю рекурсивный тип.