首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Scheme/LISP中编写除一个函数之外的所有函数?

如何在Scheme/LISP中编写除一个函数之外的所有函数?
EN

Stack Overflow用户
提问于 2009-12-11 08:12:57
回答 8查看 383关注 0票数 1

你们能想出除了一个函数之外的所有函数的最短和最常用的解决方案吗?

代码语言:javascript
复制
;; 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

编辑:除了恰好一个之外的所有。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-12-11 08:35:21

用一个更好的名字:

代码语言:javascript
复制
(define (all-except-one pred l) (= 1 (count (negate pred) l)))

(但这是PLT特定的。)

票数 4
EN

Stack Overflow用户

发布于 2009-12-11 08:20:17

如果第一个元素具有指定的属性,则对列表的其余部分调用all-but-one

如果第一个元素没有指定的属性,则对列表的其余部分调用all

票数 5
EN

Stack Overflow用户

发布于 2009-12-11 12:38:04

PLT解决方案很优雅,通常我更喜欢使用内置的高阶函数,而不是编写自己的递归函数。但是,如果你想要一个没有分配和算术的高效递归解决方案,这里就是:

代码语言:javascript
复制
(define (all-but-one pred l)
  (if (null? l) 
     #f
     ((if (pred (car l)) all-but-one all) pred (cdr l))))

递归调用位于尾部位置,因此Scheme和Common LISP都会将此代码编译成一个紧凑的循环。有些人可能更喜欢这个等价的代码:

代码语言:javascript
复制
(define (all-but-one pred l)
  (if (null? l) 
     #f
     (if (pred (car l))
        (all-but-one pred (cdr l))
        (all pred (cdr l)))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1885019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档