2016-02-27 158 views
1

我开始使用algortihm进行组合,但是当m在递归中变为0时,第一个y将是'(()),所以程序将显示只有()会重复4 *列表时间的大小。scheme - 显示所有具有最大公约数的元素对1

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

+0

你能提供一个带有预期输出的示例输入吗? –

+0

刚刚添加了一些输入和预期的输出 – zaig

+0

嗯,这不是'lcm',看起来更像'gcd'。另外,为什么'(2 15)'和'(11 15)'不包含在输出中? –

回答

2

如果我们使用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)) 
+0

如果我想将结果显示为'((2。5)(2。3)....(11。15 ))我应该修改什么? – zaig

+0

我明白了。而不是最后一对。我写了(cons(汽车对)(cadr对)) – zaig

+0

在Racket中,写得更好:(cons(第一对)(第二对)) –