0

以下の疑似コードの末尾再帰バージョンはありますか? ありがとう !

(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)))))
4

5 に答える 5

2

fold高階関数をよく読んでください。

于 2010-04-24T14:50:48.077 に答える
1
 (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)))))))
于 2010-04-24T14:52:07.543 に答える
1

リストとこれまでに見つかった最小の要素を取るヘルパー関数を定義します (b としましょう)。リストが空の場合は b を返す必要があります。そうでない場合は、リストの先頭 (a) が b よりも小さい場合は を返し(helper (cdr list) a)、そうでない場合は を返します(helper (cdr list) b)(min list)として定義できるようになりまし(helper (cdr list) (car list))た。

于 2010-04-24T14:49:37.023 に答える
0
(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 )))))
于 2010-04-25T05:36:17.293 に答える
0
(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)))))
于 2010-04-25T16:41:27.980 に答える