代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

用foldl在haskell中求数的幂

  •  1
  • devoured elysium  · 技术社区  · 14 年前

    我被要求做一个haskell函数来计算

    1^2 + 2^2 + 3^2 ...
    

    虽然我发现使用列表理解很容易实现

    sum [ k^2 | k <- [1..100]]
    

    或地图

    sum (map (\x -> x*x) [1..100])
    

    我很难用foldls来实现它。

    如果我没有错,一个递归函数中需要不少于3个参数才能得到这样的结果:

    1. 当前位置(1。。。最多n)
    2. 当前金额
    3. 停在哪里

    即使我定义了这个函数,它仍然会返回一个元组,而不是一个数字(就像我需要它一样!).

    有没有人能给我一些我可能遗漏的线索?

    谢谢

    2 回复  |  直到 14 年前
        1
  •  5
  •   mokus    14 年前

    “当前位置”(实际上是列表中的下一项,就像在地图和列表理解版本中一样)和停止位置都隐含在被折叠的列表中。当前总和是折叠的“累加器”参数。所以,填空:

    foldl (\runningSum nextNumber -> ____) 0 [1..100]
    
        2
  •  6
  •   sepp2k    14 年前

    如果你看一下 sum ,只是 sum = foldl (+) 0 . 所以如果你替换 总和 具有 foldl (+) 0 在任何一个解决方案中,都有一个使用 foldl .

    你也可以摆脱对列表理解的需要,或者 map 通过使用 福尔德尔 一个函数,它将第二个参数的平方与第一个参数相加。

    我不确定你对递归函数的考虑会在这方面发挥什么作用。如果你在使用 福尔德尔 ,您不需要使用递归(除非到目前为止 福尔德尔 使用递归实现)。

    但是,递归函数需要三个参数是错误的:递归函数求列表中每个元素的平方和,最直接的实现方法是取一个列表并将列表的头添加到调用列表尾部函数的结果中。基本情况是 squareSum [] = 0 . 这和 福尔德尔 不过。