Что представляет собой слишком глубокую ошибку уровня стека? Код Ката

-6

У меня есть этот код, который я пытаюсь объединить, но я продолжаю получать слишком высокий уровень стека:


def zeros(n)
trailing_zeros(n) if n == 1
zeros(n-1) * n
end

def trailing_zeros(number)
sort_sum = number.to_s.split(//).reverse
counter = 0
until sort_sum[counter] != "0"
counter += 1
end
counter
end

puts zeros(5)


Индивидуально, они работают нормально, но когда я пытаюсь их объединить, у меня возникают проблемы, и я не понимаю, почему. Почему это слишком сложно. От опытного разработчика. Что бы вы сказали, что это будет ошибка такого типа?
Я понимаю, что бесконечные рекурсии или что-то с действительно большим числом могут вызвать это, но какой предел? Кроме того, я читал из wikipedia, что эти ошибки также имеют какое-то отношение к системе, что ваш запуск и объем памяти, который он может использовать или выделять методам. Это правда?


------- EDIT ---------


Ну, неважно, если мой вопрос будет опущен, потому что я действительно не понимаю, что я делаю неправильно. Я также хотел упомянуть, что я пытался использовать return trailing_zeros (n), как вы, ребята, упомянули.


def zeros(n)
return trailing_zeros(n) if n == 1
zeros(n-1) * n
end

Единственная проблема с этим в том, что я получаю значение 0. Я видел его, вставив binding.pry. Я знаю, что это вопрос о нобе, но я просто не понимаю, что здесь не так. Спасибо, ребята, за ваше терпение.


------- ------ EDIT


Чтобы уточнить, я пытаюсь получить конечные нули факториала. Если я пройду через 5, я получу 1 # 120. Если я пройду 12, я получу 2 # 479001600

спросил(а) 2021-01-25T14:36:59+03:00 5 месяцев назад
1
Решение
63

Ваша функция zeros пытается сделать слишком много. Он не может вычислить факториал и в то же время считать в нем нулевые нули.


Если вы думаете об этом, когда вы вычисляете факториал, количество конечных нулей может (и будет) изменяться. Вас интересует только последнее значение. Итак, сначала вычислите это и только потом количество нулей.

# inefficient(!) recursive calculation of factorial
# for more efficiency use loop
def factorial(n)
raise "only positive values are allowed" if n < 0

return 1 if n == 0
n * factorial(n - 1)
end

def zeros(n)
trailing_zeros(factorial(n))
end

def trailing_zeros(number)
sort_sum = number.to_s.split(//).reverse
counter = 0
until sort_sum[counter] != "0"
counter += 1
end
counter
end

zeros(5) # => 1
zeros(12) # => 2

ответил(а) 2021-01-25T14:36:59+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема