我正在尝试制作一个包含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/