0

関数の再帰を行うたびに、変数の値を更新したいと考えています。簡単にするために、例を挙げます。

関数に数値 (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

どこ... =再帰(私は思う)

どうすればもっとうまく説明できるかわかりません。あなたが私を助けることができれば、それは素晴らしいことです. :)

4

1 に答える 1

2

あなたが説明したようにそれを書くことができます:

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)]
于 2013-11-07T15:53:19.667 に答える