2013-10-09 5 views
0

В следующем коде значения для 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))))))) 

ответ

1

Один из способов будет с помощью вспомогательной функции:

(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))) 
+0

Вы должны стараться избегать прохождения Avg-х и Avg-Y рекурсивно все время. – uselpa

+0

@uselpa, потому что они потребляют стек, вы имеете в виду? –

+0

Поскольку у вас создается впечатление, что они могут измениться (почему еще вы хотели бы передавать их снова и снова?), Но они этого не делают. – uselpa

3

Я не думаю, что вы хотите, чтобы они были постоянными, так как они зависят от параметров функции. Вероятно, вы просто хотите, чтобы они не пересматривались во время каждого рекурсивного вызова.

(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))))))) 
Смежные вопросы