Используя функцию сложения натуральных чисел, дайте рекурсивное определение умножения натуральных чисел? - PullRequest
2 голосов
/ 17 мая 2011

У меня есть следующее упражнение, но я не уверен, с чего начать.Формулировка не имеет смысла для меня:

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

Ответы [ 4 ]

5 голосов
/ 17 мая 2011

Вы можете думать о 3 * 5 как 5 + 5 + 5, то есть, добавляя 5 для 3 раз.Если вы хотите сделать это рекурсивно, то вы можете думать об этом так: результат a * b равен добавлению b к результату (a-1) * b.Отсюда до рекурсивной функции Haskell, шаг мал:)

1 голос
/ 17 мая 2011

Одно определение может быть:

mul m n = sum $ replicate m n

Здесь replicate a b создает список, содержащий копии b, например, копия 3 5 = [5,5,5].sum дает сумму списка, например, sum [5,5,5] равно 15. Бинго!

Конечно, использование встроенных функций было бы обманом, так как вы могли бы написать эти функции самостоятельно?Я дам вам несколько советов:

replicate' 0 x = [] 
replicate' n x = x : ??? 

sum' [] = 0
sum' (x:xs) = ???

Как правило, это хорошая домашняя стратегия, чтобы искать предопределенные функции (например, с помощью Hoogle), чтобы решить общую проблему, и заменять эти функции одну за другой.,Это помогает разделить проблемы на управляемые шаги и дает вам бесплатное представление API Haskell.

1 голос
/ 17 мая 2011
mul(n,1) = n
mul(n,m) = mul(n,m-1) + n

как то так

0 голосов
/ 17 мая 2011

Умножение i, j - не что иное, как сложение i, j раз.это код Java, но вы можете взять логику из этого.

    public int mul(int i, int j) {
        if(j==1) return i;
        return i + mul(i, j-1);
    }
...