我正在尝试制作一个包含n个数字的列表的递归函数。该函数应该做的是取n个数字的乘积,然后取n个根。我得到了n个数字的乘积,但不知道如何实现第n个根。

我尝试做的是实现expt x y函数,但在recursion中无法正确实现。而且,在尝试实现此功能时,我也不知道如何将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)

最佳答案

您需要在递归结束时计算nth根。有几种方法可以做到这一点-例如,定义帮助程序以查找产品并在计算产品后取根:

(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。使用named 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

关于recursion - 尝试取n个数的乘积的n个根的难度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54609436/

10-10 22:39