如何将列表中的每个元素乘以第一个元素,然后是第二个元素,依此类推,为每组产品制作一个列表?

How can I multiply each element of a list by the first element, then the second element, and so on, making a list for each set of products?

我目前正在尝试使用单个列表在 OCaml 中创建一个列表列表,其中每个新列表都包含每个列表元素乘以第一、第二、第三等的乘积集,列表元素。我现在还应该说,我只允许使用 ´List.hd´、´List.tl´ 和 ´List.nth´。

例如:

[-1, 1, -1, 1] -> [1, -1, 1, -1]

                  [-1, 1, -1, 1]

                  [1, -1, 1, -1]

                  [-1, 1, -1, 1]

我已经创建了一个函数,可以完美地做到这一点,但我的问题是它只是第一次这样做,因为每增加一次它就会破坏列表的头部并为新的更小的列表做这件事列表。我需要帮助才能做到这一点,以免列表在我这样做时被破坏。

这是我实现乘法并将结果作为列表附加到列表列表中的代码:

let rec hopTrainAstate = function (astate) ->
 if((astate == []))
    then []
    else multiplyAll(List.hd astate, astate)::hopTrainAstate(List.tl astate);;

这是我的乘法代码:

let rec multiplyAll = function (head, alist) ->
 if((alist == []))
    then []
    else (head *. List.hd alist)::multiplyAll(head, List.tl alist);;

下面是在上面的例子中使用该函数的结果:

[

如您所见,乘法工作得很好,但它在不断删除头部的列表上工作。我是 OCaml 的新手,所以也许这并不像我想象的那么难,但我无法在网上找到任何有帮助的东西。非常感谢任何帮助!

您的主要功能正在处理越来越小的列表,因此这或多或少是预期的结果。

如果您的主函数有第二个参数代表整个列表,这可能会有所帮助。这就是您需要传递给乘法函数的内容。

如果你不希望你的主函数有一个额外的参数(这是合理的)那么你可以写一个辅助函数。事实上,主函数中的辅助函数可以很容易地直接访问初始列表。

如果您刚开始使用 OCaml,您可能不知道辅助函数是什么。它是在 main 函数中使用的函数,用于帮助计算。例如,如果我想找到非负整数列表的最大元素,我可以这样写:

 let find_maximum l =
     let rec imax max_so_far il =
         match il with
         | [] -> max_so_far
         | hd :: tl -> 
             if hd > max_so_far then imax hd tl
             else imax max_so_far tl
     in
     imax (-1) l

在非递归主函数中使用递归辅助函数是很常见的。这允许递归函数有额外的参数。

请注意,在此示例中,辅助函数 imax 可以访问名称 l 下的原始列表,如果它对此值感兴趣的话。