Схема. Хвост рекурсивный? - PullRequest
       10

Схема. Хвост рекурсивный?

0 голосов
/ 24 апреля 2010

какая-нибудь хвостовая рекурсивная версия для упомянутого ниже псевдокода? Спасибо!

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

Ответы [ 5 ]

2 голосов
/ 24 апреля 2010

Вы должны прочитать о fold функциях высшего порядка .

1 голос
/ 24 апреля 2010
 (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)))))))
1 голос
/ 24 апреля 2010

Определите вспомогательную функцию, которая принимает список и самый маленький элемент, найденный до сих пор (назовем его b). Если список пуст, он должен вернуть b, в противном случае, если заголовок списка (a) меньше, чем b, он должен вернуть (helper (cdr list) a), в противном случае (helper (cdr list) b). Теперь мы можем определить (min list) как (helper (cdr list) (car list)).

0 голосов
/ 25 апреля 2010
(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)))))
0 голосов
/ 25 апреля 2010
(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 )))))
...