| This is a course page of David Casperson |
|
From time to time I shall post solutions to homework problems here.
fun power (x,n) = let
fun pow3 (_,0,a) = a
| pow3 (x,1,a) = x*a
| pow3 (x,n,a) = let
val d = (case n mod 2 of 0 => a | 1 => x*a)
in pow3(x, n div 2,d)
end
in pow3(x,n,1.0) end
This uses case which we haven't formally looked
at, but the
meaning should be apparent. We could equivalently write
fun power (x,n) = let
fun pow3 (_,0,a) = a
| pow3 (x,1,a) = x*a
| pow3 (x,n,a) = let
val d = (if n mod 2 = 0 then a else x*a)
in pow3(x, n div 2,d)
end
in pow3(x,n,1.0) end
letrec to
define a local function with an accumulator.
(define (reverse a-list)
(letrec
((reverse2
(lambda (b-list answer)
(cond
((null? b-list) answer)
((cons? b-list)
(reverse2 (cdr b-list)
(cons (car b-list) answer)))))
))
(reverse2 a-list '())))
Slightly more strait-forward is
(define (reverse a-list)
(reverse2 a-list '()))
(define (reverse2 b-list answer)
(cond
((null? b-list) answer)
((cons? b-list)
(reverse2 (cdr b-list)
(cons (car b-list) answer))))
))
(define (foldr f b a-list)
(cond
((null? a-list) b)
(else (f (car a-list)
(foldr f b (cdr a-list))))))
fall-2024