Math 创建表示平方和关系的图形
我试图解决平方和问题,更具体地说,创建一个函数,可以帮助处理这些关系 给定一组整数,函数应生成一个包含元组[AB]的关系, 当a和b在a中时,它们的和是一个平方数 在我的帮助下,我得到了一个帮助函数square?,它测试传递的整数是否是平方数Math 创建表示平方和关系的图形,math,clojure,lisp,Math,Clojure,Lisp,我试图解决平方和问题,更具体地说,创建一个函数,可以帮助处理这些关系 给定一组整数,函数应生成一个包含元组[AB]的关系, 当a和b在a中时,它们的和是一个平方数 在我的帮助下,我得到了一个帮助函数square?,它测试传递的整数是否是平方数 (defn square? [n] (= n (sqr (isqrt n))) ) 我用这个在黑暗中打了一枪,但老实说我迷路了 (defn sqr-sum-rel [A] (reduce (fn [a b] ( if (sq
(defn square?
[n]
(= n (sqr (isqrt n)))
)
我用这个在黑暗中打了一枪,但老实说我迷路了
(defn sqr-sum-rel
[A]
(reduce (fn [a b] (
if (square? (a + b))
[a b]
)) A )
)
测试函数应返回如下内容:
(test? "test" (sqr-sum-rel (set (range 1 11))) #{[5 4] [2 2] [8 8] [4 5] [7 9] [1 3] [3 6] [6 10] [2 7] [1 8] [8 1] [7 2] [10 6] [6 3] [3 1] [9 7]})
(defn sq-rel [a-set]
(seq (for [[x & t] (take-while seq (iterate rest a-set))
y t
:when (square? (+ x y))]
[x y])))
一般来说,我对Clojure甚至函数式编程都是新手,因此任何指向正确方向的指针都是值得赞赏的。要解决这个问题,您可以首先使用从集合中生成所有可能的数字对,然后使用这些数字对。假设正方形?如果正确实现,我们将编写一个helper函数,它将是我们传递给filter的第一个参数: 它以一组数字作为参数,并测试它们的和是否为平方?。然后我们可以编写完整的函数,如
(defn sqr-sum-rel [A]
(set (filter sum-is-square? (for [a A
b A]
[a b]))))
它以一个集合a为参数,首先生成所有由该集合中的元素组成的对,然后只保留和为平方的对?计算结果为true
我们可以通过传递一组数字来测试它:
(sqr-sum-rel (set (range 1 11)))
;; => #{[8 8] [2 2] [7 2] [5 4] [6 3] [1 3] [1 8] [8 1] [7 9] [2 7] [3 6] [10 6] [4 5] [9 7] [3 1] [6 10]}
添加:原始海报建议的更简洁的实现使用:when选项for:
我还想,集合中的数字不能与自身形成对,也没有必要按相反的顺序比较对成员,因为我们已经知道它们形成了所需的关系。我会这样更新它:
(test? "test" (sqr-sum-rel (set (range 1 11))) #{[5 4] [2 2] [8 8] [4 5] [7 9] [1 3] [3 6] [6 10] [2 7] [1 8] [8 1] [7 2] [10 6] [6 3] [3 1] [9 7]})
(defn sq-rel [a-set]
(seq (for [[x & t] (take-while seq (iterate rest a-set))
y t
:when (square? (+ x y))]
[x y])))
这一条或多或少像是一条命令
for (i = 0; i < len; i++) {
for (j = i + 1; j < len; j++)
if (isSquare(a[i] + a[j])) {
res.push([a[i], a[j]])
}
}
}
谢谢你的回答。我从中获得了一些灵感,并编写了一个没有附加辅助函数的版本:设置为[a:when square?+a b][a b]。使用这本书会有什么坏处吗?例如,从习惯用语的角度来看,它不好,或者以那种方式看,它同样好,或者更具可读性。我不知道:当功能,谢谢!
user> (sq-rel #{1 2 3 4 5 6})
;;=> ([1 3] [4 5] [6 3])