← Назад к вопросам
Числа Фибоначчи с мемоизацией
1.8 Middle🔥 191 комментариев
#Конкурентность и горутины#Кэширование#Основы Go
Условие
Реализуйте функцию вычисления n-го числа Фибоначчи с мемоизацией (кэшированием результатов).
Сигнатура
func fibonacci(n int) int
Требования
- Использовать мемоизацию для избежания повторных вычислений
- F(0) = 0, F(1) = 1
- F(n) = F(n-1) + F(n-2)
Примеры
fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(10) = 55 fibonacci(20) = 6765
Бонус
Реализуйте потокобезопасную версию с использованием sync.Map или sync.Mutex.
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Реализуем функцию вычисления чисел Фибоначчи с мемоизацией.
Простая версия с кэшем
func fibonacci(n int) int {
cache := make(map[int]int)
var fib func(int) int
fib = func(x int) int {
if x <= 1 {
return x
}
if val, ok := cache[x]; ok {
return val
}
result := fib(x-1) + fib(x-2)
cache[x] = result
return result
}
return fib(n)
}
Потокобезопасная версия с sync.Map
var fibCache sync.Map
func fibonacci(n int) int {
if n <= 1 {
return n
}
val, ok := fibCache.Load(n)
if ok {
return val.(int)
}
result := fibonacci(n-1) + fibonacci(n-2)
fibCache.Store(n, result)
return result
}
Быстрая итеративная версия
func fibonacci(n int) int {
if n <= 1 {
return n
}
a, b := 0, 1
for i := 2; i <= n; i++ {
a, b = b, a+b
}
return b
}
Анализ сложности
- Простая мемоизация: O(n) время, O(n) память
- sync.Map версия: O(n) время, O(n) память, потокобезопасна
- Итеративная: O(n) время, O(1) память
Для production рекомендуется итеративная версия.