你们能想出除了一个函数之外的所有函数的最短和最常用的解决方案吗?
;; all-but-one
;; checks if all but one element in a list holds a certain property
;; (all-but-one even? (list 1 2 4)) -> true
;; (all-but-one even? '(1)) -> true
;; (all-but-one even? '(2 4)) -> false编辑:除了恰好一个之外的所有。
发布于 2009-12-11 08:35:21
用一个更好的名字:
(define (all-except-one pred l) (= 1 (count (negate pred) l)))(但这是PLT特定的。)
发布于 2009-12-11 08:20:17
如果第一个元素具有指定的属性,则对列表的其余部分调用all-but-one。
如果第一个元素没有指定的属性,则对列表的其余部分调用all。
发布于 2009-12-11 12:38:04
PLT解决方案很优雅,通常我更喜欢使用内置的高阶函数,而不是编写自己的递归函数。但是,如果你想要一个没有分配和算术的高效递归解决方案,这里就是:
(define (all-but-one pred l)
(if (null? l)
#f
((if (pred (car l)) all-but-one all) pred (cdr l))))递归调用位于尾部位置,因此Scheme和Common LISP都会将此代码编译成一个紧凑的循环。有些人可能更喜欢这个等价的代码:
(define (all-but-one pred l)
(if (null? l)
#f
(if (pred (car l))
(all-but-one pred (cdr l))
(all pred (cdr l)))))https://stackoverflow.com/questions/1885019
复制相似问题