2016-02-27 155 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(第一對)(第二對)) –