方案 - 显示具有最大公约数 1 的所有元素对

scheme - Show all the pairs of elements which have the greatest common divisor 1

我从组合算法开始,但是当 m 在递归中变为 0 时,第一个 y 将是 '(()) 所以程序将只显示 () 它将重复 4*列表的大小次。

(define (pairs-GCD L)
 (define (comb m lst)
  (cond ((= m 0) '(()))
    ((null? lst) '())
    (else (append (map (lambda (y) (cond (equal? (GCD(car lst) y) 1) (cons (car lst) y))) (comb (- m 1) (cdr lst))) (comb m (cdr lst))))))
 (comb 2 L)

) 编辑:更正输出 输入:'(2 5 3 6 11 15) 输出:'((2 5)(2 3)(2 11)(2 15)(5 3)(5 6)(5 11)(6 11)(3 11)(6 11)(11 15))

如果我们使用 Racket 的内置程序,这很容易做到 - 我们可以轻松生成所有 2 元素组合,针对给定条件测试它们并输出包含正确对的列表:

(define (pairs-gcd lst)
  (for/list ([pair (in-combinations lst 2)]
             #:when (= (apply gcd pair) 1))
    pair))

例如:

(pairs-gcd '(2 5 3 6 11 15))
=> '((2 5) (2 3) (5 3) (5 6) (2 11) (5 11) (3 11) (6 11) (2 15) (11 15))