(def tmp = [ 1 2 3 9 4 8])
我正在尝试创建 2 对,然后对于每对,从第一个数字中减去第二个数字。期望结果: (1 6 4)
这是我正在尝试的:
(map #(apply - %2 %1) (partition 2 tmp))
我该怎么做?
分区生成一系列序列,因此映射在它们上的函数需要期望两个项目的序列。有几种方法可以表达这一点:
(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)
其他人将在无效输入时崩溃,您可能更喜欢。
这是一个使用 reduce
的解决方案
(reduce #(conj %1 (apply - (reverse %2))) [] (partition-all 2 [1 2 3 9 4 8]))
=> [1 6 4]
我想知道为什么这个解决方案被忽略了......
由于切换减法顺序只是原始减法的负数,(a-b=-(b-a)),解决方案变得更加高效(仅在这种特殊情况下!!
(map #(- (apply - %)) (partition-all 2 [1 2 3 9 4 8]))
从教学上讲,亚瑟的解决方案是正确的。这只是一个更适合特定问题的解决方案。