2016-01-29 35 views
-1

我一直在研究方案中的向量乘法函數,並發現自己處於車轍之中。我不想使用任何循環,我不想使用除已包括的函數以外的函數中構建的任何方案。我創建了一個名爲rotate和dotproduct的幫助函數。如果我在球拍(vectormult '(1 2 -1) (rotate '((0 2 3) (1 2 0) (1 0 3))))中這樣做,我可以得到正確的值。 如何在每次遞歸調用之後旋轉初始參數而無需重新旋轉?注意:我不想引入其他參數。 如果我的邏輯/方法是錯的,請幫助我走上正確的軌道。方案中的向量乘法函數,操縱初始遞歸參數

代碼

(define dotproduct 
    (lambda (l1 l2) 
    (if (or (null? l1) (null? l2)) 
     0 
     (+ (* (car l1) (car l2)) (dotproduct (cdr l1) (cdr l2)))))) 

(define getFirsts 
    (lambda (l) 
    (cond 
     ((null? l) `()) 
     (else (cons (first* l) (getFirsts (cdr l))))))) 

(define removeFirsts 
    (lambda (l) 
    (cond 
     ((null? l) `()) 
     ((null? (car l)) `()) 
     (else (cons (cdr (car l)) (removeFirsts (cdr l))))))) 

(define rotate 
    (lambda (l) 
    (cond 
     ((null? l) `()) 
     ((null? (first* l)) `()) 
     (else (cons (getFirsts l) (rotate (removeFirsts l))))))) 

(define vectormult 
    (lambda (l1 l2) 
    (cond 
     ((null? l2) `()) 
     (else (cons (dotproduct l1 (car l2)) (vectormult l1 (cdr l2))))))) 
+0

'vectormult'不會出現叫'rotate';這些額外旋轉來自哪裏? –

+0

我想利用vectormult中的旋轉函數,所以我不必在參數中調用它 –

回答

0

我最終放棄了旋轉功能,贊成添加2個功能getFirstsremoveFirsts

代碼

(define getFirsts 
    (lambda (l) 
    (cond 
     ((null? l) `()) 
     (else (cons (first* l) (getFirsts (cdr l))))))) 

(define removeFirsts 
    (lambda (l) 
    (cond 
     ((null? l) `()) 
     ((null? (car l)) `()) 
     (else (cons (cdr (car l)) (removeFirsts (cdr l))))))) 

;(define rotate 
; (lambda (l) 
; (cond 
;  ((null? l) `()) 
;  ((null? (first* l)) `()) 
;  (else (cons (getFirsts l) (rotate (removeFirsts l))))))) 

(define vectormult 
    (lambda (l1 l2) 
    (cond 
     ((null? (first* l2)) `()) 
     (else (cons (dotproduct l1 (getFirsts l2)) (vectormult l1 (removeFirsts l2))))))) 
0

如果我理解這個問題,你可以(相應地並改變其遞歸調用)重新命名當前的vectormult,比方說,rotatedvectormult,然後有vectormult調用rotatedvectormult之前只需旋轉參數。這樣,rotatedvectormult會知道參數已經旋轉,但vectormult仍然可以採用未旋轉的向量。