有您的代碼2級的錯誤:
1)else
子句中,你應該遞歸調用自己,丟棄第二個元素:
(else (getlargest (cons (car a_list) (cddr a_list))))))
2)你缺少只有一個元素,其中cadr
將失敗
((null? (cdr a_list)) (car a_list))
而我個人更喜歡得到#f
如果該列表是空的名單的情況。因此,該代碼將如下所示
(define (getlargest a_list)
(cond
((null? a_list)
#f)
((null? (cdr a_list))
(car a_list))
((< (car a_list) (cadr a_list))
(getlargest (cdr a_list)))
(else
(getlargest (cons (car a_list) (cddr a_list))))))
當然,使用foldl
一個解決方案是優選的:
(define (getlargest lst)
(foldl (lambda (e r) (if (or (not r) (> e r)) e r))
#f
lst))
,或者可能稍微更有效的:
(define (getlargest lst)
(if (null? lst)
#f
(foldl (lambda (e r) (if (> e r) e r))
(car lst)
(cdr lst))))
而內建的'max'很容易實現SRFI 1的'reduce':'(define(max。 (減少(lambda(ab)(如果(> ab)ab))#f項目))' – 2014-11-25 14:58:27
在哪一個筆記,我想你忘了'應用'在你最後一段的某處...... – 2014-11-25 15:03:15
@ ChrisJester-年輕人懂了! – 2014-11-25 15:06:09