以下の疑似コードの末尾再帰バージョンはありますか? ありがとう !
(define (min list)
(cond
((null? list) '())
((null? (cdr list)) (car list))
(#t (let ((a (car list))
(b (min (cdr list))))
(if (< b a) b a)))))
以下の疑似コードの末尾再帰バージョンはありますか? ありがとう !
(define (min list)
(cond
((null? list) '())
((null? (cdr list)) (car list))
(#t (let ((a (car list))
(b (min (cdr list))))
(if (< b a) b a)))))
fold
高階関数をよく読んでください。
(define (min list)
(let imin ((l (cdr list))
(m (car list)))
(cond
((null? l) m)
(else
(let ((a (car l)))
(imin (cdr l)
(if (< a m) a m)))))))
リストとこれまでに見つかった最小の要素を取るヘルパー関数を定義します (b としましょう)。リストが空の場合は b を返す必要があります。そうでない場合は、リストの先頭 (a) が b よりも小さい場合は を返し(helper (cdr list) a)
、そうでない場合は を返します(helper (cdr list) b)
。(min list)
として定義できるようになりまし(helper (cdr list) (car list))
た。
(define (min ns)
(let loop ( (ns-left ns) (min-so-far maxint) )
(if (null? ns-left)
min-so-far
(loop
(cdr ns-left)
(if (< (car ns-left) min-so-far)
(car ns-left)
min-so-far )))))
(define (min list)
(min-helper list #f))
(define (min-helper list min-so-far)
(if (null? list)
min-so-far
(let ((m (car list)))
(if (eq? min-so-far #f)
(set! min-so-far m))
(if (< m min-so-far)
(min-helper (cdr list) m)
(min-helper (cdr list) min-so-far)))))