【问题标题】:Save variable and use it on recursion保存变量并在递归中使用它
【发布时间】:2017-02-06 08:09:49
【问题描述】:

假设我有以下功能

printVariance :: [Float] -> IO ()
printVariance [] = return ()
printVariance (x:xs)
    | x >= avg (x:xs) = print (x - avg (x:xs)) >> printVariance xs
    | otherwise       = printVariance xs

获取列表,检查哪些元素大于平均值并打印它们的value - avg

我的问题是avg 值每一步都在变化。如何只定义一次并将其值用于递归?

【问题讨论】:

  • 您可能希望使用折叠和映射来重写它,而不是直接递归。这将允许您附加 wherelet 绑定,您可以将 avg 定义为类似于 (foldr (+) 0 xs) / length xs 的内容。

标签: haskell recursion functional-programming


【解决方案1】:

将递归移动到辅助函数中。该函数可以将平均值作为参数,也可以在本地定义为 printVariance 并定义另一个保存平均值的局部变量,然后该函数可以访问该变量。

在代码中:

printVariance :: [Float] -> IO ()
printVariance xs = loop xs
  where
    average = avg xs
    loop [] = return ()
    loop (x:xs)
      | x >= average = print (x - average) >> loop xs
      | otherwise = loop xs

PS:将 IO 与程序逻辑分开是一个很好的设计。所以我建议你让你的函数简单地产生一个你想要的值列表,而不是打印它们并将 IO 移动到一个单独的函数中(或者只是 main)。

PPS:您并没有真正计算方差,因此我建议将函数命名为其他名称。

【讨论】:

  • 啊,我们编写了相同的程序。为了简洁起见,我将删除我的答案:)
  • 你做到了,我不知道我怎么想不到,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2022-11-18
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
相关资源
最近更新 更多