方案中的向量乘法函数,操纵初始递归参数

时间:2016-01-29 19:35:10

标签: recursion lambda scheme racket

我一直在研究计划中的向量乘法函数,并发现自己已经陷入了困境。我不想使用任何循环,我不想使用任何内置函数的方案,而不是我已经包含的函数。我创建了一个名为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)))))))

2 个答案:

答案 0 :(得分:0)

如果我理解了这个问题,您可以将当前的vectormult重命名为rotatedvectormult(并相应地更改其递归调用),然后让vectormult只旋转参数致电rotatedvectormult。这样,rotatedvectormult就会知道参数已经旋转,但vectormult仍然可以采用未旋转的向量。

答案 1 :(得分: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)))))))