方案中的向量乘法函数,操纵初始递归参数
Vector multiply function in scheme, manipulating initial recursive parameter
我一直在研究方案中的向量乘法函数,但发现自己陷入了困境。我不想使用任何循环,我不想使用任何内置函数的方案,除了我已经包含的那些。我创建了一个名为 rotate 和 dotproduct 的辅助函数。如果我在 racket (vectormult '(1 2 -1) (rotate '((0 2 3) (1 2 0) (1 0 3))))
中这样做,我可以获得正确的值。 如何在每次递归调用后不重新旋转的情况下旋转初始参数?注意:我不想引入额外的参数。 如果我的 logic/approach 完全错误,请帮助我走上正轨。
代码
(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)))))))
如果我理解这个问题,您可以将当前的 vectormult
重命名为 rotatedvectormult
(并相应地更改其递归调用),然后让 vectormult
旋转调用 rotatedvectormult
之前的参数。这样,rotatedvectormult
会知道参数已经旋转,但 vectormult
仍然可以采用未旋转的向量。
我最终放弃了旋转功能,转而添加了 2 个功能 getFirsts
和 removeFirsts
。
代码
(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)))))))
我一直在研究方案中的向量乘法函数,但发现自己陷入了困境。我不想使用任何循环,我不想使用任何内置函数的方案,除了我已经包含的那些。我创建了一个名为 rotate 和 dotproduct 的辅助函数。如果我在 racket (vectormult '(1 2 -1) (rotate '((0 2 3) (1 2 0) (1 0 3))))
中这样做,我可以获得正确的值。 如何在每次递归调用后不重新旋转的情况下旋转初始参数?注意:我不想引入额外的参数。 如果我的 logic/approach 完全错误,请帮助我走上正轨。
代码
(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)))))))
如果我理解这个问题,您可以将当前的 vectormult
重命名为 rotatedvectormult
(并相应地更改其递归调用),然后让 vectormult
旋转调用 rotatedvectormult
之前的参数。这样,rotatedvectormult
会知道参数已经旋转,但 vectormult
仍然可以采用未旋转的向量。
我最终放弃了旋转功能,转而添加了 2 个功能 getFirsts
和 removeFirsts
。
代码
(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)))))))