我怎么能使用尾递归,找到任何非负小数以下的最大整数?
我已经定义了函数largest :: Fractional f -> Int i
但是在这种情况下看不出我如何使用尾递归。
答案 0 :(得分:1)
任何Fractional
都有类别定义,例如:
class Num a => Fractional a where
fromRational :: Rational -> a
-- ...
使用:
type Rational = Ratio Integer
和
(%) :: Integral a => a -> a -> Ratio a
我还假设存在一个类型约束,以便我们可以比较两个f
(Fractional
实例)。所以我们能做的是:
0
,Rational
,其值累加器+ 1 ,Rational
投射到f
类型,f
与给定的f
,所以在代码中看起来像这样:
import Data.Ratio((%))
largest :: (Fractional a, Ord a) => a -> Integer
largest v = largest' 0
where largest' x | fromRational (x1%1) >= v = x -- increment is less than or equal, return x
| otherwise = largest' x1 -- if smaller, recursion
where x1 = x+1 -- increment accumulator
这给出了:
*Main Data.Ratio> largest (7%5)
1
*Main Data.Ratio> largest (21%5)
4
*Main Data.Ratio> largest (1%5)
0
如果您想要更多关于返回类型的自由(任何Num
,您可以在基础案例中添加fromIntegral
:
import Data.Ratio((%))
largest :: (Fractional a, Ord a, Num b) => a -> b
largest v = largest' 0
where largest' x | fromRational (x1%1) >= v = fromIntegral x -- increment is less than or equal, return x
| otherwise = largest' x1 -- if smaller, recursion
where x1 = x+1 -- increment accumulator