Функция f
определяется правилом f(n) = n, if n<3
и f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3), if n > 3
. Напишите процедуру, которая вычисляет f
с помощью рекурсивного процесса.
Это уже уже написано:
f(n) = n, (* if *) n < 3
= f(n - 1) + 2f(n - 2) + 3f(n - 3), (* if *) n > 3
Верьте или нет, когда-то был такой язык . Чтобы записать это на другом языке, это просто вопрос синтаксиса. И, кстати, определение, которое вы (неправильно) цитируете, содержит ошибку, которая теперь очень очевидна и ясна.
Напишите процедуру, которая вычисляет f
с помощью итеративного процесса.
Итерация означает движение вперед ( есть ваше объяснение!) В противоположность рекурсии назад сначала:
f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3)
= a + 2b + 3c
f(n+1) = f(n ) + 2f(n - 1) + 3f(n - 2)
= a' + 2b' + 3c' a' = a+2b+3c, b' = a, c' = b
......
Таким образом, переходы состояния задачи описываются как
(n, a, b, c) -> (n+1, a+2*b+3*c, a, b)
Мы могли бы закодировать его как
g (n, a, b, c) = g (n+1, a+2*b+3*c, a, b)
но, конечно, это никогда не остановится. Поэтому вместо этого мы должны иметь
f n = g (2, 2, 1, 0)
where
g (k, a, b, c) = g (k+1, a+2*b+3*c, a, b), (* if *) k < n
g (k, a, b, c) = a, otherwise
и это уже в точности как код, о котором вы спрашивали, вплоть до синтаксиса.
Подсчет до n более естественен здесь, следуя нашей парадигме «идти вперед», но обратный отсчет до 0 , как код, который вы цитируете, конечно, полностью эквивалентен.
Угловые кейсы и возможные ошибки не учитываются: упражнение неинтересные технические детали.