我想计算满足以下表达式的最小“n”:( n + a)^ k< m ^ n = n其中a,k,m是Haskell中的3个整数。到目前为止,我已经做到了这一点,但它似乎是一种情感。我究竟做错了什么?
search a k m
|(n+a)^k < m^n = n
where
n = count 1
where
count :: Integer -> Integer
count 1000000 = 1000000
count n = count (n+1)
我的思路是,每次计数都会增加一,表达式会被检查,但显然它会一直上升到1000000(这只是一个屋顶值)
答案 0 :(得分:2)
我会写的略有不同
search a k m = go 1
where go 10000 = 10000
go n = if ((n+a)^k < m^n) then n else go (n+1)
使用
进行测试search 2 3 4
返回
4
答案 1 :(得分:1)
我使用filter
中的minimum
和Data.List
组合器,如下所示:
import Data.List
search :: Int -> Int -> Int -> Int
search a k m =
minimum $ filter (\n -> (n+a)^k < m^n) [1 .. 1000000]
-- filter picks out the n that satisfy the inequality and minimum gives you the minimum
----根据收到的评论进行更新:
上面定义的search
问题是,如果1 .. 1000000
范围内没有解决方案,它将抛出异常。
编写搜索(即不抛出异常)的更安全的方法是使用Maybe
来编码在给定范围内没有解决方案的可能性。类似的东西:
safeSearch :: Int -> Int -> Int -> Int -> Maybe Int
safeSearch a k m roof =
let
solutions = filter (\n -> (n+a)^k < m^n) [1 .. roof]
in
case solutions of
[] -> Nothing
_ -> Just $ head solutions