Function 计划在整个计划中保持价值

Function 计划在整个计划中保持价值,function,scheme,constants,Function,Scheme,Constants,在以下代码中,avg和avg2的值随着代码的进行而变化。如何使值在整个函数中保持不变,而不在函数外部定义它们?我应该使用助手函数吗 (define (covariance-list x y) (let ((avg (average x))) (let ((avg2 (average y))) (if (null? x) '() (cons (* (- (car x) avg)(- (car y) avg2)) (covariance

在以下代码中,avg和avg2的值随着代码的进行而变化。如何使值在整个函数中保持不变,而不在函数外部定义它们?我应该使用助手函数吗

(define (covariance-list x y)
  (let ((avg (average x)))
  (let ((avg2 (average y)))
  (if (null? x) 
      '()
      (cons (* (- (car x) avg)(- (car y) avg2)) 
            (covariance-list (cdr x) (cdr y)))))))

我认为你不希望它们是常数,因为它们取决于函数的参数。您可能只是希望在每次递归调用期间不重新计算它们

(define (covariance-list x y)
 (let ((avg (average x))
       (avg2 (average y)))
     (let loop ((x x)
                (y y))
       (if (null? x)
         '()
          (cons (* (- (car x) avg)
                   (- (car y) avg2))
                (loop (cdr x) (cdr y)))))))

我认为你不希望它们是常数,因为它们取决于函数的参数。您可能只是希望在每次递归调用期间不重新计算它们

(define (covariance-list x y)
 (let ((avg (average x))
       (avg2 (average y)))
     (let loop ((x x)
                (y y))
       (if (null? x)
         '()
          (cons (* (- (car x) avg)
                   (- (car y) avg2))
                (loop (cdr x) (cdr y)))))))

一种方法是使用辅助功能:

(define (covariance-list x y)
  (define (covariance-list-aux x y avg-x avg-y)
    (if (null? x)
      '()
      (cons (* (- (car x) avg-x) (- (car y) avg-y))
            (covariance-list-aux (cdr x) (cdr y) avg-x avg-y))))
  (covariance-list-aux x y (average x) (average y)))

一种方法是使用辅助功能:

(define (covariance-list x y)
  (define (covariance-list-aux x y avg-x avg-y)
    (if (null? x)
      '()
      (cons (* (- (car x) avg-x) (- (car y) avg-y))
            (covariance-list-aux (cdr x) (cdr y) avg-x avg-y))))
  (covariance-list-aux x y (average x) (average y)))

您应该尽量避免总是递归地传递avg-x和avg-y。@uselpa,因为它们正在消耗堆栈,您的意思是?因为您得到的印象是它们可能会改变(否则为什么您会希望一次又一次地传递它们?),但它们不会。@uselpa,这是一个有趣的设计约束/编码标准。我能理解其中的逻辑。但是,我始终将常量传递给过程。有没有一个编码标准可以让我参考(可能是特定于方案的)来详细阐述这个想法?你应该尽量避免总是递归地传递avg-x和avg-y。@uselpa,因为它们正在消耗堆栈,你的意思是?因为你觉得它们可能会改变(否则你为什么要一遍又一遍地传递它们?),但是他们没有。@uselpa,这是一个有趣的设计约束/编码标准。我能理解其中的逻辑。但是,我始终将常量传递给过程。有没有一个编码标准可以让我参考(可能是特定于方案的)来详细阐述这个想法?