Functional Problem Solving (CSC 151 2015F) : EBoards

CSC151.01 2015F, Class 22: Images as Functions from Position to Colors


Overview

Preliminaries

Admin

Upcoming Work

Extra Credit Opportunities

Academic

Peer Support

Other Good Things

Quiz 5

You are now at the point that you should be able to notate lists correctly. Please do so in the future.

The last problem caused trouble for many of you. It asked you to identify whether the parameter was a non-zero, even, integer.

Here's one solution

 (define non-zero-even?
   (lambda (num)
     (cond
       [(not (integer? num))
        #f]
       [(not (even? num))
        #f]
       [(zero? num)
        #f]
       [else
        #t])))

However, as ZS says, "If you find yourself explicitly writing #t and #f, you can probably simplify it."

 (define non-zero-even?
   (lambda (num)
     (and (integer? num) (even? num) (not (zero? num)))))

Some clever people combined the first two and ended up with

 (define non-zero-even?
   (lambda (num)
     (and (integer? (/ num 2)) (not (zero? num)))))

HW Questions

Do you have hints on problem 1?

I'd probably write some helper functions (or partial steps).

    ;;; Name:
    ;;;   better-unit-square
    ;;; Type:
    ;;;   drawing
    ;;; Value:
    ;;;   A 1x1 square with top-left at (0,0)

    ;;; Procedure:
    ;;;   make-line
    ;;; Parameters:
    ;;;   n, a non-negative integer
    ;;;   color1, a color
    ;;;   color2, a color
    ;;; Purpose:
    ;;;   Make a square for problem 1
    ;;; Produces:
    ;;;   square, a drawing
    ;;; Preconditions:
    ;;;   [No additional]
    ;;; Postconditions:
    ;;;   (drawing-left square) = 0
    ;;;   (drawing-top sqaure) = n
    ;;;   if n is even, (drawing-color square) = color1
    ;;;   if n is odd, (drawing-color square) = color2

At some point, I'd likely use a structure like

    (map (lambda (x) (if (even? x) ....)) 
         (iota num))

Question 2 on the exam asks us to take a function as a parameter. Can we really do that?

Yes. You've seen it happen in other cases, such as with map or ls. Here's a simple example.

    ;;; Procedure:
    ;;;   apply-to-two
    ;;; Parameters:
    ;;;   fun, a one-parameter function 
    ;;; Purpose:
    ;;;   Apply fun to the value 2
    ;;; Produces:
    ;;;   val, a value
    ;;; Preconditions:
    ;;;   fun must accept an integer as an input
    ;;; Postconditions:
    ;;;   val = (fun 2)
    (define apply-to-two
      (lambda (fun)
        (fun 2)))

    > (apply-to-two square)
    4
    > (apply-to-two increment)
    3
    > (apply-to-two (lambda (x) (+ 7 (* x 2))))
    11

You can apply a function with (function params) whether it's a built-in function, or one that you've named with define, or even one you've taken as a parameter.

One of the functions is wrong on problem 2, isn't it?

Yes. Sorry.

How would you handle the recoloring of the dots in problem 2?

I'd write a separate helper function

    ;;; Procedure:
    ;;;   recolor-point
    ;;; Parameters:
    ;;;   point, a drawing
    ;;; Purpose:
    ;;;   Recolor point based on its position
    ;;; Produces:
    ;;;   colored-point, a drawing
    ;;; Preconditions:
    ;;;   [No additional]
    ;;; Postconditions:
    ;;;   If y < 50, colored-point is blue
    ;;;   Otherwise, colored-point is red

How do we compute a random number in problem 3?

(random n) gives an integer between 0 and n-1, inclusive.

Lab

Writeup: 3ef