2016-01-29 16 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仍然可以采用未旋转的向量。