轨道
/
Common Lisp
Common Lisp
/
练习
/
Logan 的数字划分
Logan 的数字划分

Logan 的数字划分

学习练习

简介

归约

归约就是对序列中的每个元素重复应用一个函数,并以某种方式把结果累积起来。 所应用的函数接受两个形参:当前的累积值和要处理的元素。 它的求值结果必须是新的累积值。

在 Common Lisp 中,这个过程由reduce函数完成。 最简单的形式如下:

(reduce #'function-to-apply sequence :initial-value value)

注意这里提供了初始值,它就是在处理第一个元素时传入函数的“当前累积值”。

下面这个例子把数组中的数字加在一起,初始值为 10:

(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20

注意,如果序列为空,函数不会被调用,而这个表达式的求值结果就是初始值。

说明

Lisp 外星人 Logan 喜欢数字,也喜欢整理归纳。

他们请你帮忙写一个函数:这个函数接收一个数字数组,然后生成一对数组,第一个数组放所有奇数,第二个数组放所有偶数。

1. 对数字进行分类

首先,你需要创建一个函数,它接收一对数组和一个数字,并根据这个数字是奇数还是偶数,把它放进正确的子数组里:

(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))

2. 给大量数字分类

现在,用你刚创建的这个函数,可以再写一个函数,它接收一个数字数组,然后像上面那样给它们分类:

(partition-numbers '(1 2 3 4))     ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Common Lisp Exercism

准备好开始 Logan 的数字划分 了吗?

注册 Exercism,借助 27 个概念92 个练习 和真人导师指导,学习并掌握 Common Lisp,全部免费。