LINUX.ORG.RU

Объясните, SICP

 , , , ,


0

2

Привет.

К делу.

Задача из СИКП 1.3

Определите процедуру, которая принимает в качестве аргументов три числа и возвращает сумму квадратов двух больших из них.

#lang racket

(define (square x) (* x x))
(define (sum_of_squares x y) (+ (square x) (square y)))
(define (the_largest_num a b c)
  ( (cond ( (and (> a b) (> a c)) a)
          ( (and (> b a) (> b c)) b)
          (else c)
    )
  )
)
(define (average a b c)
  ((if ( (and (< b (the_largest_num a b c))) (> b c)) b c)))


(define (the_sum_of_the_max_and_aver a b c)
  (sum_of_squares ((the_largest_num a b c)) ((average a b c))))
  

ошибка: Применение: не процедура;   Ожидается, что процедура может быть применена к аргументам

Понятно, что ничего не понятно.

Как я думаю не работает, а именно. Стартует the_largest, подставляет значение, потом averge ну и тд.

PS. just for fun, как хобби. Я понимаю, что это можно сделать короче, красивее. Ну в общем как сделал.


У тебя много скобок лишних: ((the_largest_num a b c)) ((average a b c))

Вот пример решения.

(define (min first-num second-num)
  (if (< first-num second-num)
      first-num
      second-num))

(define (max first-num second-num)
  (if (> first-num second-num)
      first-num
      second-num))

(define (square num)
  (* num num))

(define (get-sum first-num second-num third-num)
  (+ (square (max first-num second-num))
     (square (max (min first-num second-num) third-num))))

GoodPerson
()
Ответ на: комментарий от GoodPerson

Убрал скобки, все равно пишет ошибку, теперь другую
application: not a procedure; expected a procedure that can be applied to arguments given: 3 arguments...: [none]

Сделал так

#lang racket

(define (square x) (* x x))
(define (sum_of_squares x y) (+ (square x) (square y)))

(define (the_sum_of_the_max_and_aver a b c)
  (cond ((and (> a c) (> b c) (sum_of_squares a b)))
        ((and (> a b) (> c b) (sum_of_squares a c)))
        (else (sum_of_squares b c))
  )
)

Ваше решение мне нравится тоже. Но хочется разобраться в ошибке

ChuCha
() автор топика
Ответ на: комментарий от ChuCha

Ты скобки процедур «and» закрываешь не там, где нужно. Это надо было сделать до того, как вызывать следствие.

Короче, надо так:


(cond ((and (> a c) (> b c)) (sum_of_squares a b))
      ((and (> a b) (> c b)) (sum_of_squares a c))
      (else (sum_of_squares b c))
)

Also, можно было использовать процедуру «min».


(cond ((= (min a b c) c) (sum_of_squares a b))
      ((= (min a b c) b) (sum_of_squares a c))
      (else (sum_of_squares b c))
)

Qazder
()

Еще можно сложить все и вычесть минимум.

anonymous
()
Ответ на: комментарий от Qazder
(cond ((and (> a c) (> b c)) (sum_of_squares a b))
      ((and (> a b) (> c b)) (sum_of_squares a c))
      (else (sum_of_squares b c))
)

ошибка, что нет скобок.

Я про свой изначальный пример говорил, в топике. Какая там ошибка

ChuCha
() автор топика
Ответ на: комментарий от ChuCha

про свой изначальный пример говорил, в топике. Какая там ошибка

Лишние скобки перед cond, if и the_largest_num.

Nervous ★★★★★
()
Ответ на: комментарий от znenyegvkby

там и square встроенный тоже есть. Только вот, книжка эта не про язык, а про программирование. похапешнику [your avatar here] видимо не понять этого. Продолжай «рендерить страницы»

currency2017
()
Ответ на: комментарий от currency2017

там и square встроенный тоже есть.

Да что ты говоришь!

Только вот, книжка эта не про язык, а про программирование.

Да что ты говоришь!

похапешнику [your avatar here] видимо не понять этого. Продолжай «рендерить страницы»

Ну Царь, ну куда нам смертным до тебя. Ты уже свитчи для trie закончил генерировать? :)

znenyegvkby
()
Последнее исправление: znenyegvkby (всего исправлений: 1)
Ответ на: комментарий от currency2017

Вот ведь раскудахтался. Смысла ноль, главное что-то прокукарекать.

Тесак, ты забыл перелогиниться.

znenyegvkby
()
Ответ на: комментарий от GoodPerson

На самом деле есть, но дальше.

Ага, у меня вот с детства хорошая привычка перед началом чтения _любой книги_ знакомиться с предметно-алфавитным указателем чтобы потом не бегать из начала в конец.

[Go to first, previous, next page; contents; index]
M
max (primitive procedure)
...
min (primitive procedure)

znenyegvkby
()
Ответ на: комментарий от anonymous

Почему нет? Зайди на SO и посмотри как иные извращенцы конвертируют примеры из SICP в руби или пистоны. И живут же, значит и ты выживешь.

znenyegvkby
()
Ответ на: комментарий от anonymous

какая разница, на каком языке ты будешь выполнять примеры? Трудности там могут возникнуть, разве что с каким-нибудь строготипизированным говном. CL вполне подойдет. Главное, чтобы ты понимал код, поэтому схему все равно надо знать в основе, по этой причине, удобней, таки взять именно ее. Но там глубоко знать не надо, там используется очень маленькое подмножество.

currency2017
()
Ответ на: комментарий от anonymous

Ага, я уже поправил это. Заметил сегодня при тестах.

ChuCha
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.