В упражнение просит сделать полоски шире, как в предыдущем упражнении. Я включил упражнение и код из него вместе с кодом, с которым я возился, чтобы получить желаемый результат.
Я знаю, что это легко сделать с помощью петель, но суть упражнения в том, чтобы использовать то, что уже было описано в книге. 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 ответ
Чтобы ответить на этот вопрос, вам не нужно ничего сложного, просто обратите внимание, что шаблон является двоичным, включен и выключен, и сравните это с тем, как нечетные и четные числа соответствуют одному шаблону, затем примените его и масштабируйте по ширине полосы.
Как только вы это увидите, вы можете определить это несколькими способами, один из них будет примерно таким:
(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)
Это работает, потому что <=
принимает один или несколько аргументов и делает то, что вы от него ожидаете.