Решение упражнения 1.4 из SICP

14 August, 2007 (22:23) | Решения упражнений

Итак, нам предлагают код процедуры:

(define (a-plus-abs-b a b) 
  ((if (> b 0) + -) a b))

Работает она очень просто и естественно (особенно если не вспоминать об ограничениях многих императивных языков). Так как операции + и являются такими же полноправными членами языка, как и переменные, мы можем включать их в любые языковые конструкции. В данном случае мы над a и b выполням сложение, если b положительно и вычитание в противном случае. Нетрудно видеть, что это эквивалентно сложению a с модулем b.

Comments

Comment from ikuchmin
Date: October 24, 2010, 1:59 pm

На самом деле, операция не делает сложение с модулем b, возмите в качестве примера (a-plus-abs-b 2 -1).

Comment from dnspv2.0
Date: October 10, 2012, 11:42 am

ikuchmin, все работает.
> (a-plus-abs-b 2 -1)
3

Вероятно, где-то Вы ошиблись. Проверьте скобки.

Хотя маловероятно, что проблема все еще актуальна ))

Comment from entesl
Date: March 31, 2013, 6:55 pm

это не эквивалентно сложению a c модулем b, т.к b может равнятся нулю, а здесь этого не предусмотренно.

Comment from DeadStranger
Date: July 7, 2013, 10:55 pm

(define (a-plus-abs-b a b)
((if (or (> b 0) (= b 0)) + -) a b))
А вот так все в порядке.

Comment from Siarhei R
Date: October 9, 2013, 4:17 pm

Comment from entesl
Date: March 31, 2013, 6:55 pm
это не эквивалентно сложению a c модулем b, т.к b может равнятся нулю, а здесь этого не предусмотренно.

если b = 0, то условие b>0 не выполняется и в результате получается а – 0, тоесть правильный ответ. Так что всё учтено

Write a comment