On this page:
3.1 Sign
3.2 leap-year?
3.3 Evaluatie van complexe expressies
3.4 Lokale definities
3.5 Lokale definities:   tangens
7.8

3 Complexe Procedures

3.1 Sign

Definieer een procedure (sign number) die een getal als argument neemt en 1 teruggeeft als dat nummer positief is, -1 als het negatief is en 0 als het getal gelijk is aan 0.

(define (sign number)
  (cond ((zero? number) 0)
        ((> number 0) 1)
        (else -1)))

 

> (sign -5)

-1

> (sign 17.28)

1

> (sign 0)

0

3.2 leap-year?

Definieer een predicaat leap-year? dat een jaartal als argument neemt en teruggeeft of het betreffende jaar een schrikkeljaar is. Alle jaren die deelbaar zijn door 400 zijn schrikkeljaren, alle jaren die deelbaar zijn door 100 (maar niet door 400) zijn geen schrikkeljaren, en alle jaren die deelbaar zijn door 4 (maar niet door 100) zijn wel schrikkeljaren. Alle jaren die niet aan de voorgaande voorwaarden voldoen zijn dan weer geen schrikkeljaren.

(define (divides? deler deeltal)
  (= 0  (modulo deeltal deler)))
 
(define (leap-year? year)
  (if (divides? 4 year)
      (if (divides? 100 year)
          (divides? 400 year)
          #t)
      #f))
 
(define (leap-year2? year)
  (cond ((divides? 400 year) #t)
        ((divides? 100 year) #f)
        ((divides? 4 year) #t)
        (else #f)))
 
(define (leap-year3? year)
 (if (divides? 400 year)
     #t
     (if (divides? 100 year)
         #f
         (divides? 4 year))))
 
 
(define (leap-year4? year)
 (or (divides? 400 year)
     (and (divides? 4 year)
          (not (divides? 100 year)))))

 

> (leap-year? 1989)

#f

> (leap-year? 2000)

#t

> (leap-year? 1900)

#f

Hint: Je definieert best een predicaat divides? dat teruggeeft of een getal exact een ander getal deelt. Je kan hiervoor de procedure (modulo n m) gebruiken, welke de rest teruggeeft bij deling van n door m. Bijvoorbeeld:

> (modulo 10 3)

1

3.3 Evaluatie van complexe expressies

Voorspel, zonder gebruik te maken van DrRacket, het resultaat van onderstaande expressies (veronderstel dat ze in volgorde geëvalueerd worden). Waarom krijg je het verwachte resultaat?

3.4 Lokale definities

Schrijf een procedure (bereken x) die voor x berekent wat de uitkomst is van \(\frac{x-1}{2x+3} +\frac{2x+3}{x-1}\). Maak gebruik van lokale definities om je code leesbaar te houden.

(define (bereken x)
  (define exp1 (- x 1))
  (define exp2 (+ (* 2 x) 3))
  (+ (/ exp1 exp2)
     (/ exp2 exp1)))

 

> (bereken 11)

29/10

3.5 Lokale definities: tangens

Schrijf een procedure (tangens-dubbel x) die aan de hand van onderstaande formule berekent wat de tangens van de dubbele hoek is. Maak gebruik van lokale definities, zodat \(tan(x)\) slechts één keer berekend wordt.

\[tan(2x)= \frac{2tan(x)}{1 - tan^2(x)}\]

Hint: Scheme heeft een ingebouwde procedure tan om de tangens van een hoek te berekenen.

(define (tangens-dubbel x)
  (define tx (tan x))
  (/ (* 2 tx)
     (- 1 (* tx tx))))

 

> (tangens-dubbel (/ 3.14 6))

1.7299292200897898