我应该编写一个函数,其中包含每个前一个乘法与该数字的乘积
基本上这个:
> productFromLeftToRight [2,3,4,5]
[120,60,20,5]
我应该使用高阶函数,所以折叠等等。我正在考虑使用foldr遍历列表中的lambda表达式。这就是我的想法:
> productFromLeftToRight nums = foldr (\x acc -> [x] * acc ++ acc) [] nums
因为它会像f(2 (f 3 (f 4 (f 5 []))))
那样解开,我认为我是对的,但是我得到了整个打印错误而且我不知道如何将数字与acc的第一个元素相乘(负责人没有工作)
答案 0 :(得分:4)
productFromLeftToRight = scanr1 (*)
或
productFromLeftToRight' =
snd . foldr (\x (acc,lst) -> (x * acc, x * acc : lst)) (1,[])
答案 1 :(得分:2)
productFromLeftToRight nums =
init $ foldr (\x lst -> x * head lst : lst) [1] nums
这个想法是在答案列表中使用虚拟元素1
并最终删除它。
答案 2 :(得分:0)
这是另一个在foldr
:
productFromLeftToRight = foldr (\n ps -> n * foldr const 1 ps : ps) []
此处,内部foldr const 1
充当非部分head
函数以获取ps
的第一个元素:
foldr const 1 (x:xs) = const x (foldr const 1 xs) = x
foldr const 1 [] = 1