有您的代码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