Functional Problem Solving (CSC 151 2015F) : EBoards
Primary: [Front Door] [Schedule] - [Academic Honesty] [Disabilities] [Email] - [FAQ] [Teaching & Learning] [Grading] [Taking Notes] [Rubric] [Remote Access]
Current: [Assignment] [EBoard] [Lab] [Outline] [Reading]
Sections: [Assignments] [EBoards] [Labs] [Outlines] [Readings] - [Examples] [Handouts]
Reference: [Setup] [VM] [Errors] - [Functions A-Z] [Functions By Topic] - [Racket] [Scheme Report (R5RS)] [R6RS] [TSPL4]
Related Courses: [Curtsinger (2015F)] [Davis (2013F)] [Rebelsky (2015S)] [Weinman (2014F)]
Misc: [Submit Questions] - [SamR] [Glimmer Labs] [CS@Grinnell] [Grinnell] - [Issue Tracker (Course)]
Overview
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.
even? on a non-integer,
so we better make sure that it's an integer before we call even?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)))))
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
maporls. 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.
Writeup: 3ef