使用Haskell中的递归计算满足比较的最小数

时间:2017-03-26 01:23:46

标签: haskell

我想计算满足以下表达式的最小“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(这只是一个屋顶值)

2 个答案:

答案 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中的minimumData.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