Recursion 试图求n个数的乘积的n次根很困难

Recursion 试图求n个数的乘积的n次根很困难,recursion,scheme,racket,Recursion,Scheme,Racket,我想做一个递归函数,它接受n个数字的列表。这个函数应该做的是取n个数的乘积,然后取n个根。我得到了n个数的乘积,但不知道如何实现n个根 我尝试的是实现expt x y功能,但在中无法正确执行。此外,在尝试实现此函数时,我也不知道如何将第n个根输入expt函数(y=1/n) (define (nth-root-of-product-of-numbers lst) (cond [(empty? lst) 1] [else (* (first lst) (nth-root-of-p

我想做一个递归函数,它接受n个数字的列表。这个函数应该做的是取n个数的乘积,然后取n个根。我得到了n个数的乘积,但不知道如何实现n个根

我尝试的是实现expt x y功能,但在中无法正确执行。此外,在尝试实现此函数时,我也不知道如何将第n个根输入expt函数(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)

您需要在递归结束时计算第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))))
一个更有效的解决方案是编写一个尾部递归过程,并传递元素的数量,以避免在最后计算
长度。以下是如何使用:

更惯用的解决方案是使用内置程序计算产品:

(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

请使用示例输入和预期输出编辑问题。确定。我已经编辑了一个示例输入和预期输出。
(nth-root-of-product-of-numbers (list 9 14 2))
=> 6.316359597656378