#haskell #recursion #numbers
#haskell #рекурсия #числа
Вопрос:
У меня есть следующее упражнение, но я не уверен, с чего мне следует начать. Формулировка не имеет смысла для меня:
Используя функцию сложения над натуральными числами, дать рекурсивное определение умножения натуральных чисел.
Ответ №1:
Вы можете думать о 3 * 5
как 5 5 5
, то есть добавлять 5
для 3
раз. Если вы хотите сделать это рекурсивно, то вы можете представить это так: результат a * b
равен добавлению b
к результату (a-1) * b
. Отсюда до рекурсивной функции Haskell шаг небольшой 🙂
Ответ №2:
mul(n,1) = n
mul(n,m) = mul(n,m-1) n
что-то вроде этого
Ответ №3:
Одно из определений было бы:
mul m n = sum $ replicate m n
Здесь replicate a b
создается список, содержащий a копий b, например replicate 3 5 = [5,5,5]. sum
выдает сумму списка, например sum [5,5,5]
, равную 15. Бинго!
Конечно, использование встроенных функций было бы мошенничеством, так как же вы могли написать эти функции самостоятельно? Я дам вам несколько советов:
replicate' 0 x = []
replicate' n x = x : ???
sum' [] = 0
sum' (x:xs) = ???
Как правило, хорошей домашней стратегией является поиск предопределенных функций (например, с помощью Hoogle) для решения общей проблемы и замена этих функций одну за другой. Это помогает разделить задачи на управляемые этапы и дает вам бесплатное знакомство с Haskell API.
Ответ №4:
Умножение i, j — это не что иное, как сложение i, j раз. это Java-код, но вы можете извлечь логику из этого.
public int mul(int i, int j) {
if(j==1) return i;
return i mul(i, j-1);
}
Комментарии:
1. Вы, должно быть, один из тех людей, которые думают, что натуральные числа начинаются с 1 🙂