Используя функцию сложения над натуральными числами, дать рекурсивное определение умножения натуральных чисел?

#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 🙂