Функция широких полос в Racket

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

Я знаю, что это легко сделать с помощью петель, но суть упражнения в том, чтобы использовать то, что уже было описано в книге. http://www.facom.ufu.br/~marcelo/PF/pictures_racket.pdf

Мне нужен способ реализовать выражение ряда (5n + 4), чтобы получить желаемый результат.

Я начинаю думать, что нет способа без циклов или использования операторов if и т. Д. (Здесь цель — использовать только условные выражения) Я думаю, что того, что у меня есть, будет достаточно, но я знаю, что это неправильно, и книга Я полагаю, позже покажет лучший способ.

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

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

(require picturing-programs)
; builds an image black to red from left to right (see above lines 282-305)
(define (always-zero x y)
  ; x a number
  ; y a number
  0
  )
(define WIDTH 150)
(define HEIGHT 100)
; make-stripes : number number -> Image

; Takes in a width and height to create a shape
; with even and odd numbered stripes

(define (red-stripe x y)
  (cond [(= (modulo (* y y) 2) 0) 255]
        [else 0]))

(define (blue-stripe x y)
  (cond[(= (modulo (* y y) 3) 1) 255]
       [else 0]))

(define (make-stripes width height)
  (build3-image width height red-stripe always-zero blue-stripe))

; another-make-stripe-function

(define (add5 y)
  (+ y 5))

(define (red-stripe2 x y)
  (cond [(even?  (add5 y)) 255] 
        [else 0]))

(define (blue-stripe2 x y)
  (cond[(odd? (- 150 y)) 255]
       [else 0]))

(define (make-wide-stripes width height)
  (build3-image width height red-stripe2 always-zero blue-stripe2))

(build3-image 150 100 red-stripe2 always-zero blue-stripe2)

(define red (color 255 0 0 255))
(define blue (color 0 0 255 255))

(define total-rows
  (/ HEIGHT 5)) ;20

(define (row y)
  (+ y 5)) ;

(define (0-4? n)
  (and (>= n 0)
       (<= n 4)))

(define (5-9? n)
  (and (>= n 5)
       (<= n 9)))

(define (10-14? n)
  (and (>= n 10)
       (<= n 14)))

(define (15-19? n)
  (and (>= n 15)
       (<= n 19)))

(define (20-24? n)
  (and (>= n 20)
       (<= n 24)))

(define (25-29? n)
  (and (>= n 25)
       (<= n 29)))

(define (blue-or-red x y)
  (cond [(0-4? y) blue]
        [(5-9? y) red]
        [(10-14? y) blue]
        [(15-19? y) red]
        [(20-24? y) blue]
        [(25-29? y) red]
        [else blue]))

(define (random-br-picture width height)
  (build-image width height blue-or-red))

(build-image 150 100 blue-or-red)

1 ответ
1

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

Как только вы это увидите, вы можете определить это несколькими способами, один из них будет примерно таким:

(define (blue-or-red x y)
  (cond [(odd? (quotient y 5)) red]
        [else blue]))

Или вы, конечно, можете использовать modulo проверьте еще раз, в основном определяя свой собственный odd? (или же even?) предикатировать таким образом.

Обратите внимание, что cond эквивалентен if здесь вы также можете написать это:

(define (blue-or-red x y)
  (if (odd? (quotient y 5)) red blue))

Вы написали, что хотите, чтобы все было осмысленно с любым размером изображения: просто убедитесь, что везде, где вы ссылаетесь на 150 или 100, вы вместо этого используете правильные переменные, WIDTH а также HEIGHT и у вас должно быть все готово. Однако в целом использование прописных букв в именах переменных необычно. Кроме того, вы, вероятно, также можете сделать эти параметры пользовательской функцией, чтобы они не определялись глобально (например, (define (make-my-bitmap width height) ...) а затем пропустите их).


Хотя определять их как отдельные предикаты не нужно, сравнение чисел также можно упростить:

(<= 15 n 19)

Это работает, потому что <= принимает один или несколько аргументов и делает то, что вы от него ожидаете.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *