Clojure使用逻辑和
我正在学习Clojure,并试图用这种语言解决Project的Euler()问题。 第二个问题是求斐波那契数列中的偶数项之和,其值不超过四百万 我已经尝试了几种方法,如果我能找到它的破损点,我会发现下一种方法是最准确的。现在它返回0。我很确定take while条件存在问题,但无法解决Clojure使用逻辑和,clojure,predicates,Clojure,Predicates,我正在学习Clojure,并试图用这种语言解决Project的Euler()问题。 第二个问题是求斐波那契数列中的偶数项之和,其值不超过四百万 我已经尝试了几种方法,如果我能找到它的破损点,我会发现下一种方法是最准确的。现在它返回0。我很确定take while条件存在问题,但无法解决 (reduce + (take-while (and even? (partial < 4000000)) (map first (iterate (fn [[a b]] [b (+ a
(reduce +
(take-while (and even? (partial < 4000000))
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1]))))
(减少+
(需要一段时间(甚至?(部分<4000000))
(首先映射(迭代(fn[[ab]][b(+ab)])[01]))
或者,直接使用匿名函数形式可能会更清楚:
user> (reduce +
(take-while (and even? #(< % 4000000))
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1]))))
9227464
从这一点我们可以看出,我们实际上并不想在take while
上组合谓词evan?
和小于-4000000,因为这将在任一条件为真时停止,只留下数字零。相反,我们希望使用一个谓词作为限制,另一个作为过滤器
或者,直接使用匿名函数形式可能会更清楚:
user> (reduce +
(take-while (and even? #(< % 4000000))
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1]))))
9227464
从这一点我们可以看出,我们实际上并不想在
take while
上组合谓词evan?
和小于-4000000,因为这将在任一条件为真时停止,只留下数字零。相反,我们希望使用一个谓词作为限制,另一个作为过滤器。要以这种方式组合多个谓词,可以使用每个pred
:
(every-pred even? (partial > 4000000))
此表达式的返回值是一个函数,它接受一个参数,如果它是偶数且大于4000000,则返回
true
,否则返回false
。要以这种方式组合多个谓词,可以使用每个pred
:
(every-pred even? (partial > 4000000))
此表达式的返回值是一个函数,它接受一个参数,如果它是偶数且大于4000000,则返回
true
,否则返回false
。Cool。谢谢你的解释!现在我遇到了另一个问题——由于某种原因,结果(9227464)是实际解决方案(4613732)的两倍。它是如何翻倍的?这是因为(和偶数?(partial>4000000))
返回(partial>4000000)
——它在任何意义上都不构成这两个谓词,而是计算偶数?
和(partial>4000000)
的逻辑“和”。它们既不是false
也不是nil
,因此它们都是真实的,因此将返回最后一个。最终只有(部分>4000000)
最终被take while使用。谢谢你的解释!现在我遇到了另一个问题——由于某种原因,结果(9227464)是实际解决方案(4613732)的两倍。它是如何翻倍的?这是因为(和偶数?(partial>4000000))
返回(partial>4000000)
——它在任何意义上都不构成这两个谓词,而是计算偶数?
和(partial>4000000)
的逻辑“和”。它们既不是false
也不是nil
,因此它们都是真实的,因此将返回最后一个。最终,只有(部分>4000000)
最终被take while
使用。那么,为什么我要为此代码获取0?(take while(every pred偶数?(partial>100))(range))您将获得一个序列”(0)
,因为take while
在谓词返回非真值时停止消费。对于0它将返回true(为偶数且小于100),但是对于1它将返回false,因为它不是偶数。因此,您可能希望使用过滤器
。根据您对函数的口头描述,我认为您的意思是(部分<4000000)。user>(map(部分<4000000)[0整数/MAX_值])=>(false-true)那么为什么我对该代码得到0?(take while(every pred偶数?(partial>100))(range))您将获得一个序列”(0)
,因为take while
在谓词返回非真值时停止消费。对于0它将返回true(为偶数且小于100),但是对于1它将返回false,因为它不是偶数。因此,您可能希望改用过滤器
。我认为您的意思是(部分<4000000),基于您对函数的口头描述。user>(map(部分<4000000)[0整数/最大值])=>(false-true)
(every-pred even? (partial > 4000000))