8
 (def tmp = [ 1 2 3 9 4 8])

我正在尝试创建 2 对,然后对于每一对,从第一个数字中减去第二个数字。期望的结果:(1 6 4)

这是我正在尝试的:

(map #(apply - %2 %1) (partition 2 tmp))

我怎样才能做到这一点?

4

3 回答 3

11

分区产生一系列序列,因此您映射到它们上的函数需要期待一个包含两个项目的序列。有几种表达方式:

(def tmp  [ 1 2 3 9 4 8])

user> (map #(- (second %) (first %)) (partition-all 2 tmp ))
(1 6 4)

user> (map #(apply - (reverse %)) (partition-all 2 tmp ))
(1 6 4)

user> (map (fn [[small large]] (- large small)) (partition-all 2 tmp ))
(1 6 4)

使用 apply 的版本不同,因为它仍然会在奇数长度列表上“工作”:

user> (map #(apply - (reverse %)) (partition-all 2 [1 2 3 4 5 6 7] ))
(1 1 1 -7)

其他人将在无效输入时崩溃,您可能更喜欢。

于 2012-10-09T19:04:39.870 回答
2

这是使用的解决方案reduce

(reduce #(conj %1 (apply - (reverse %2)))  [] (partition-all 2 [1 2 3 9 4 8])) 
=> [1 6 4]
于 2012-10-09T20:06:56.950 回答
0

我想知道为什么这个解决方案被忽略了......

由于切换减法顺序只是原始减法的负数,(ab = -(ba)),因此解决方案变得更加有效(仅在这种特殊情况下!!)

(map #(- (apply - %)) (partition-all 2 [1 2 3 9 4 8]))

在教学法上,亚瑟的解决方案是正确的。这只是一个更适合特定问题的解决方案。

于 2012-12-13T00:46:14.940 回答