Сложность попыток взять n-й корень из произведения n чисел - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь создать рекурсивную функцию, которая принимает список из n чисел.То, что должна сделать эта функция, это взять произведение n чисел и затем взять n-ный корень.Я получил результат работы n чисел, но не знаю, как реализовать n-ный корень.

Я пытался реализовать функцию , исключая xy , но могне поймите это правильно в .Более того, пытаясь реализовать эту функцию, я также не знаю, как я смогу передать функции expt корень n-й. (y = 1 / n) .

(define (nth-root-of-product-of-numbers lst)
  (cond [(empty? lst) 1]
        [else (* (first lst) (nth-root-of-product-of-numbers (rest lst)))]))

Таким образом, приведенный выше код корректно отображает продукт в списке из n чисел, однако это не таккомпенсировать n-ную корневую проблему.Пример ввода будет:

(check-within
(nth-root-of-product-of-numbers (cons 9 (cons 14 (cons 2 empty)))) 6.316359598 0.0001)

1 Ответ

0 голосов
/ 10 февраля 2019

Вам необходимо вычислить 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
...