racket
Herhaling
Zoeken…
Gebruik definiëren
#lang racket
(define (sum-of-list l)
(if (null? l)
0
(+ (car l)
(sum-of-list (cdr l)))))
(sum-of-list '(1 2 3 4 5)) ;; => 15
Let-rec gebruiken
#lang racket
(letrec ([sum-of-list (λ (l)
(if (null? l)
0
(+ (car l) (sum-of-list (cdr l)))))])
(sum-of-list '(1 2 3 4 5)))
;; => 15
Het is mogelijk om wederzijds recursieve functies te schrijven met letrec :
#lang racket
(letrec ([even? (λ (n) (if (= n 0) #t (odd? (sub1 n))))]
[odd? (λ (n) (if (= n 0) #f (even? (sub1 n))))])
(list (even? 3)
(odd? 5)))
;; => '(#f #t)
Een benoemde let gebruiken
Een normale let vorm bindt elke waarde aan zijn overeenkomstige identificatie, voordat de body wordt uitgevoerd. Met een "genaamd let " kan de body vervolgens recursief opnieuw worden uitgevoerd, waarbij een nieuwe waarde voor elke identificatie wordt doorgegeven.
#lang racket
(let sum-of-list ([l '(1 2 3)])
(if (null? l)
0
(+ (car l) (sum-of-list (cdr l)))))
;; => 15
Het is gebruikelijk om rec te gebruiken als de naam voor de let, die geeft:
#lang racket
(let rec ([l '(1 2 3 4 5)])
(if (null? l)
0
(+ (car l) (rec (cdr l)))))
;; => 15
Gebruik rec
#lang racket
(require mzlib/etc)
((rec sum-of-list
(λ (l)
(if (null? l)
0
(+ (car l) (sum-of-list (cdr l))))))
'(1 2 3 4 5))
;; => 15
;; Outside of the rec form, sum-of-list gives an error:
;; sum-of-list: undefined;
;; cannot reference an identifier before its definition
Dit is vergelijkbaar met define , maar de sum-of-list ID is niet zichtbaar buiten het rec formulier.
Om te voorkomen dat een expliciete λ , is het mogelijk om de sum-of-list te vervangen door (sum-of-list args ...) :
#lang racket
(require mzlib/etc)
((rec (sum-of-list l)
(if (null? l)
0
(+ (car l) (sum-of-list (cdr l)))))
'(1 2 3 4 5))
;; => 15
Hogere-orde functies gebruiken in plaats van recursie
Het is gebruikelijk om hogere orde functies te gebruiken in plaats van recursie, als er een hogere orde functie is die het juiste recursiepatroon uitdrukt. In ons geval kan de sum-of-numbers worden gedefinieerd met behulp van foldl :
#lang racket
(define (sum-of-numbers l)
(foldl + 0 l))
(sum-of-numbers '(1 2 3 4 5)) ;; => 15
Het is mogelijk om foldl rechtstreeks foldl de lijst te bellen:
#lang racket
(foldl + 0 '(1 2 3 4 5)) ;; => 15