Вам необходимо вычислить n-ный корень в конце рекурсии.Есть несколько способов сделать это - например, определение вспомогательной процедуры для поиска продукта и получения корня после его вычисления:
(define (nth-root-of-product-of-numbers lst)
(define (product lst)
(cond [(empty? lst) 1]
[else (* (first lst) (product (rest lst)))]))
(expt (product lst) (/ 1 (length lst))))
Более эффективным решением было бы написание хвостовой рекурсивной процедуры,и передать количество элементов, чтобы избежать вычисления length
в конце.Вот как, используя с именем let
:
(define (nth-root-of-product-of-numbers lst)
(let loop ((lst lst) (acc 1) (n 0))
(cond [(empty? lst)
(expt acc (/ 1 n))]
[else
(loop (rest lst) (* (first lst) acc) (add1 n))])))
Еще более идиоматичным решением было бы использование встроенных процедур для расчета продукта:
(define (nth-root-of-product-of-numbers lst)
(expt (apply * lst) (/ 1 (length lst))))
В любом случае, все работает как положено:
(nth-root-of-product-of-numbers (list 9 14 2))
=> 6.316359597656378