수색…
정의 사용하기
#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 사용하기
#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
letrec
하여 상호 재귀 함수를 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)
명명 된 let 사용
일반 let
양식은 본문을 실행하기 전에 각 값을 해당 ID에 바인드합니다. "named let
"을 사용하면 본문을 재귀 적으로 다시 실행하여 각 식별자에 대해 새 값을 전달할 수 있습니다.
#lang racket
(let sum-of-list ([l '(1 2 3)])
(if (null? l)
0
(+ (car l) (sum-of-list (cdr l)))))
;; => 15
let의 이름으로 rec
를 사용하는 것이 일반적입니다.
#lang racket
(let rec ([l '(1 2 3 4 5)])
(if (null? l)
0
(+ (car l) (rec (cdr l)))))
;; => 15
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
이것은 define
과 유사하지만 sum-of-list
의 sum-of-list
식별자는 rec
양식 외부에 표시되지 않습니다.
명시 적 λ
사용하지 않으려면 sum-of-list
를 (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
재귀 대신 고차 함수 사용
올바른 재귀 패턴을 표현하는 상위 차수 함수가있는 경우 재귀 대신 상위 함수 를 사용하는 것이 일반적입니다. 여기서는 foldl
사용하여 sum-of-numbers
를 정의 할 수 있습니다.
#lang racket
(define (sum-of-numbers l)
(foldl + 0 l))
(sum-of-numbers '(1 2 3 4 5)) ;; => 15
foldl
목록에서 직접 호출 할 수 있습니다.
#lang racket
(foldl + 0 '(1 2 3 4 5)) ;; => 15
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow