수색…


정의 사용하기

#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-listsum-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