вычислить сумму правильных делителей заданного числа в Racket BSL - PullRequest
0 голосов
/ 07 ноября 2018

Разработайте функцию Racket с именем findProperDivisor, которая принимает натуральное число и вычисляет сумму всех ее соответствующих делителей. Правильный делитель натурального числа - это делитель, который строго меньше числа.

Примеры:

Ввод: 20

Выход: 22

// Правильные делители: 1 + 2 + 4 + 5 + 10 = 22

(define (sum-of-proper-divisors n i)
  (cond [(= i 1) 1]
        [(= (remainder n i) 0)
         (+ i (sum-of-proper-divisors n (sub1 i)))]
        [else (sum-of-proper-divisors n (sub1 i))]))

Я нашел этот код на этой странице, но он дает мне 1+2+4+5+10+20=42 Мне нужно 22.

Я хотел бы написать этот код с одним параметром, используя рекурсию и cond. Я использую язык начинающих студентов (BSL), для которого не определены такие вещи, как let.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Чтобы выполнить условие strictly smaller than itself, назовите его с (sum-of-proper-divisors 20 (sub1 20)), тогда вы получите 22, с тех пор 20 не считается делителем.

Поскольку вы должны определить эту функцию только с одним числом в качестве аргумента, - из-за ограничений этого языка для начинающих я бы определил желаемую функцию как вторую функцию:

(define (sum-of-proper-divisors n i)
  (cond ((= 1 i) 1)
        ((= (remainder n i) 0)
         (+ i (sum-of-proper-divisors n (sub1 i))))
        (else (sum-of-proper-divisors n (sub1 i)))))

(define (findProperDivisors n)
  (sum-of-proper-divisors n (sub1 n)))

(findProperDivisors 20) ;; => 22
0 голосов
/ 08 ноября 2018

Шаг 1: понять, что делает код. Почему есть дополнительный параметр? Что с этим происходит?

Шаг 2: Как вы это называете? Что это значит для i?

Шаг 3: Что бы вы сделали по-другому, чтобы остаток не сравнивался с самим номером?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...