【问题标题】:Haskell Refresh a variables valueHaskell 刷新变量值
【发布时间】:2015-08-04 03:32:52
【问题描述】:

每次我对函数进行递归时,我都想刷新一个变量值。为了简单起见,我举个例子。

假设我们给一个函数一个数字 (n),它会返回它可以拥有的最大的 mod,数字比它自己更小。

{- Examples:
  n=5 `mod` 5
  n=5 `mod` 4
  n=5 `mod` 3
  n=5 `mod` 2
  n=5 `mod` 1
-}

example :: Integer -> Integer
example n
    |  n `mod` ...  >  !The biggest `mod` it found so far!  && ... > 0
       = !Then the biggest `mod` so far will change its value.
    |  ... = 0 !The number we divide goes 0 then end! = 0

其中 ... = 递归(我认为)

我不知道如何更好地描述它。如果你能帮助我,那就太好了。 :)

【问题讨论】:

  • 向函数添加第二个参数,如example n acc = ...

标签: haskell recursion


【解决方案1】:

你可以按照你的描述写:

example :: Integer -> Integer
example n = biggestRemainder (abs n) 0
    where
        biggestRemainder 0 biggestRemainderSoFar = biggestRemainderSoFar
        biggestRemainder divisor biggestRemainderSoFar = biggestRemainder (divisor - 1) newBiggestRemainder
            where
                thisRemainder = n `mod` divisor
                newBiggestRemainder = case thisRemainder > biggestRemainderSoFar of
                    True -> thisRemainder
                    False -> biggestRemainderSoFar

这个函数也可以更简单地写成

example2 :: Integer -> Integer
example2 0 = 0
example2 n = maximum $ map (n `mod`) [1..(abs n)]

【讨论】:

  • ahm 为什么你使用 case (thisRemainder > biggest..)of True .. 而不是 if 语句?
  • max thisRemainder biggestRemainderSoFar
  • 我讨厌 if-then-else。它应该只是一个前奏功能if :: Bool -> a -> a -> a。至于max,我通常用不依赖于其他代码的代码来回答问题,除非其他代码提供了重要的东西。在这种情况下,如果您将所有 case 替换为 max,则代码中与问题平行的代码将非常少,因此提问者更难理解。
猜你喜欢
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多