Math 创建表示平方和关系的图形

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

我试图解决平方和问题,更具体地说,创建一个函数,可以帮助处理这些关系

给定一组整数,函数应生成一个包含元组[AB]的关系, 当a和b在a中时,它们的和是一个平方数

在我的帮助下,我得到了一个帮助函数square?,它测试传递的整数是否是平方数

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