Квадрат сумм в ракетке / схема - PullRequest
0 голосов
/ 30 января 2019

Я пишу квадрат сумм в ракетке / схеме рекурсивно.Код правильно суммирует числа, но это не правильно.Я не знаю, что я делаю не так.Если я пройду 10, это должно быть 3025.

(define (squareOfSums n)
 (if (= n 0)
  0
   (expt (+ n (squareOfSums (- n 1))) 2)))

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Вот версия, которая, на мой взгляд, идиоматична, но я надеюсь, что никто, кто знает какие-либо математики, не напишет:

(define (square-of-sums n)
  (let loop ([m n] [sum 0])
    (if (> m 0)
        (loop (- m 1) (+ sum m))
        (* sum sum))))

Вот версия, написанная кем-то, кто знает некоторые математики:

(define (square-of-sums n)
  (expt (/ (* n (+ n 1)) 2) 2))

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

0 голосов
/ 30 января 2019

Если вы начнете со своей функции, написав несколько примеров, вам будет легче представить, как ваша функция будет работать.

Вот три примера:

(check-expect (SquareOfSums 0)  0)
(check-expect (SquareOfSums 2)  (sqr (+ 2 1))) ;9
(check-expect (SquareOfSums 10) (sqr (+ 10 9 8 7 6 5 4 3 2 1))) ;3025

Как мыМожно ясно видеть, что мы используем два оператора, которые должны указывать на то, что нам нужно использовать какую-то вспомогательную функцию, чтобы выручить нас.

Мы можем начать с нашей основной функции squareOfSums:

(define (squareOfSums n)
  (sqr (sum n)))

Теперь нам нужно создать вспомогательную функцию.

Сколько раз вы используете оператор сложения, зависит от числа, которое вы используете.По этой причине нам придется использовать естественную рекурсию.

Использование естественной рекурсии требует некоторого базового случая для того, чтобы функция где-то «заканчивалась».В данном случае это значение 0.

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

(define (sum n)
  (if (= 0 n)
      0
      (+ n (sum (sub1 n)))))
0 голосов
/ 30 января 2019

Вы должны выполнять возведение в квадрат только один раз , в конце рекурсии.В настоящее время ваш код при каждой итерации равен .Одним из способов решения этой проблемы было бы разделение части суммы на вспомогательную процедуру и возведение в квадрат результата ее вызова.Например:

(define (squareOfSums n)
  (define (sum n)
    (if (= n 0)
        0
        (+ n (sum (- n 1)))))
  (sqr (sum n)))

Кроме того, знаете ли вы, что есть формула для добавления всех натуральных чисел до n?Это более подходящее решение, без рекурсии:

(define (squareOfSums n)
  (sqr (/ (* n (+ n 1)) 2)))

В любом случае, оно работает как положено:

(squareOfSums 10)
=> 3025
...