Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure使用逻辑和_Clojure_Predicates - Fatal编程技术网

Clojure使用逻辑和

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

我正在学习Clojure,并试图用这种语言解决Project的Euler()问题。 第二个问题是求斐波那契数列中的偶数项之和,其值不超过四百万

我已经尝试了几种方法,如果我能找到它的破损点,我会发现下一种方法是最准确的。现在它返回0。我很确定take while条件存在问题,但无法解决

(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))