2015-02-10 57 views
1

我想創建一個叫做lcm-from-factors的函數來計算兩個數的最小公倍數(m和n)函數的輸入是m-co-group和n-co-group,它們列出所有主要因素和他們的權力。例如,對於m = 2970和n = 163,800,我們將有:如何在球拍中實現遞歸功能?

m-co-groups ='((2 1)(3 3)(5 1)(7 0)(11 1)(13 0)) n-co-groups ='((2 3)(3 2)(5 2)(7 1)(11 0)(13 1))

這些函數返回一個叫做co-已經給予我的因素。我寫了代碼,但函數沒有編譯,因爲我相信我沒有正確實現遞歸。我很感激任何幫助,弄清楚我做錯了什麼。我的代碼如下。

(define (lcm-from-factors m n) 
     (let-values (((m-co-groups n-co-groups) (co-factor m n))) 
      (define (recurse m-co-groups n-co-groups) 
       (let* ((a (first(m-co-groups))) 
         (b (first(n-co-groups)))) 
        (cond ((>= (rest(a)) (rest(b))) 
         (+ (expt (first(a)) (rest(a))) (recurse (rest(m-co-groups)) (rest(n-co-groups))))) 
         (else (+ (expt (first(b)) (rest(b))) (recurse (rest(m-co-groups)) (rest(n-co-groups)))))))))) 
+0

從我看到的'(co-factor mn)'必須評估到兩個程序列表,因爲你應用了元素('(a)'和'(b)'),這些程序應該因爲你試圖「首先」結果? – Sylwester 2015-02-10 13:20:02

+0

是的我得到的函數確實返回兩​​個列表,如m = 2970和n = 163,800所示。 – user2904796 2015-02-10 13:25:07

+0

但是,由於某些原因,我無法完成(第一個(m-co-groups))? – user2904796 2015-02-10 13:25:46

回答

0

以下是讓您入門的墊腳石。 該代碼處理m和n具有相同質數因素的特定情況。 這是你的工作,找出如何處理其他案件。

#lang racket 
(require math/number-theory) 

(define (co-factor m n) (values (factorize m) (factorize n))) 
(define (exponent power) (second power)) 
(define (base power)  (first power)) 

(define (lcm-from-factors m n) 
    (let-values ([(m-co-groups n-co-groups) (co-factor m n)]) 
    (define (recurse m-co-groups n-co-groups) 
     (cond 
     [(and (empty? m-co-groups) (empty? n-co-groups)) 1] 
     [(empty? m-co-groups)        'something-1] 
     [(empty? n-co-groups)        'something-2] 
     [else 
     (define a-power (first m-co-groups)) 
     (define b-power (first n-co-groups)) 
     (define a-base (base a-power)) 
     (define b-base (base b-power)) 
     (define a-exp (exponent a-power)) 
     (define b-exp (exponent b-power)) 
     (cond 
      [(= a-base b-base) (* (expt a-base (max a-exp b-exp)) 
            (recurse (rest m-co-groups) (rest n-co-groups)))] 
      [(< a-base b-base) 'something-3] 
      [(> a-base b-base) 'something-4])])) 
    (recurse m-co-groups n-co-groups))) 

(define x (* (expt 2 3) (expt 3 4))) 
(define y (* (expt 2 1) (expt 3 5))) 

(lcm-from-factors x y) ; gives 1944 
(lcm x y)    ; gives 1944