Перейти к содержимому

Дан HTTP-сервер на Go с одним эндпоинтом /collatz, который принимает одно число и возвращает последовательность Коллат

network · httpAndersen - 21 кв 2026не решено

Дан HTTP-сервер на Go с одним эндпоинтом /collatz, который принимает одно число и возвращает последовательность Коллатца для него. Требуется доработать API и реализацию согласно следующим пунктам:

  • Расширить API - изменить формат запроса так, чтобы можно было передавать массив чисел, а в ответе возвращать последовательность (или последовательности) для каждого числа;
  • Вычислять последовательность конкурентно - для каждого числа из массива запустить отдельную горутину, вычисляющую последовательность Коллатца;
  • Реализовать механизм остановки по первому завершившемуся - как только одна из горутин первой завершит вычисление, нужно остановить остальные вычисления и вернуть результат именно этого «победителя»;
  • Кешировать результаты - хранить результаты вычислений для каждого числа в map (кеш), чтобы при повторном запросе того же числа не вычислять его заново;
  • Обеспечить конкурентный доступ к кешу - использовать механизмы синхронизации для безопасного чтения и записи в map из нескольких горутин;
  • Обрабатывать прерывание от пользователя - реализовать возможность корректно завершить вычисления, если клиент разорвал соединение или отменил запрос.
type req struct {
Num []int
}
type resp struct {
Sequence []int
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/collatz ", func(w http.ResponseWriter, r *http.Request) {
in, _ := io.ReadAll(r.Body)
data := &req{}
err := json.Unmarshal(in, data)
if err != nil {
log.Fatalf(err.Error())
}
res := &resp{Sequence: collatz(data.Num)}
out, err := json.Marshal(res)
w.Write(out)
})
http.ListenAndServe(":8080 ", mux)
}
func collatz(n int) []int {
iter := []int{}
for n != 1 {
iter = append(iter, n)
if n%2 == 0 {
n = n / 2
continue
}
n = 3*n + 1
}
return iter
}

Источник: Andersen - 2 · 1 кв 2026

Все задачи · Сети и протоколы · Реализуйте middleware для HTTP-клиента… →