2010-04-24 110 views
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))))) 
+0

這裏有一個擾流板:http://inferretuation.blogspot.com/2008/05/lists-and-lists-tail-recursive-fun.html如果這是家庭作業,你在您提交自己的答案之前可能不想閱讀它! – 2010-04-26 04:55:38

回答

2

您應該閱讀fold higher-order functions

+0

在Scheme中,SRFI 1提供'fold'(http://srfi.schemers.org/srfi-1/srfi-1.html)。如果您使用PLT,請說'(require srfi/1)'。如果使用Guile,請說'(use-modules(srfi srfi-1))'。對於其他實現,請閱讀各自的手冊。 :-) – 2010-04-26 04:49:33

1

定義一個幫助函數,它帶有一個列表和迄今爲止找到的最小元素(我們稱之爲b)。如果列表爲空,則應返回b,否則如果列表(a)的頭部小於b,則應返回(helper (cdr list) a),否則返回(helper (cdr list) b)。現在我們可以將(min list)定義爲(helper (cdr list) (car list))

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