Схема (Racket) Правильно написанная функция не работает с некоторыми входами

Итак, я написал функцию в ракетке, которая вычисляет суммы:

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a) (sum term (next a) next b))))

Термин - это то, какая функция применяется к каждому аргументу. A — начало следующего — это то, как мы переходим к следующему элементу (т. е. a2 = 2*a1 или a2 = a1 +1 и т. д.), а b — последний элемент.

Есть 2 дополнительные функции:

(define (square x) (* x x))
(define (inc x) (+ x 1))

Если я наберу:

(сумма в квадрате 1 плюс 5) Я понял, что верно 55

Но если я наберу:

(сумма квадрат 1 квадрат 5)

Я застрял в петле!? Почему a2 должно быть равно a1*a1 и a3=a2*a2, а a должно превосходить b, чтобы условие завершения рекурсии было полным. Очень странный.


person MitakaJ9    schedule 06.01.2015    source источник
comment
(квадрат 1) никогда не будет больше 5, так как всегда равен 1 :-)   -  person Diego    schedule 06.01.2015
comment
Я чувствую себя таким тупым сейчас! Благодарю вас!   -  person MitakaJ9    schedule 06.01.2015
comment
@DiegoNietoCid: это ответ, а не комментарий.   -  person Svante    schedule 06.01.2015
comment
@Svante Я чувствовал, что это слишком короткий ответ ... должен ли я все же перевести его в правильный ответ?   -  person Diego    schedule 06.01.2015
comment
@Svante Хорошо, я ответил после прочтения некоторых вопросов о мета, касающихся коротких ответов. Спасибо!   -  person Diego    schedule 06.01.2015
comment
Вы должны принять ответ, если считаете, что это нормально, Митака.   -  person gsamaras    schedule 09.01.2015
comment
Я новичок здесь принял это сейчас ;)   -  person MitakaJ9    schedule 01.02.2015


Ответы (1)


Ваша функция sum будет зацикливаться вечно, потому что (square 1) всегда оценивается как 1 и никогда не будет больше 5.

person Diego    schedule 06.01.2015