使用给定的前导数字获得2的最低功率

时间:2018-02-22 12:26:26

标签: haskell math

我必须定义lowestPower以便

lowestPower           :: Integer -> (Integer,Integer)

lowestPower n(k, m)对,其中m是2的最低幂,其十进制表示以数字n开头,k是其指数(即2^k = m)。例如,

 lowestPower 3             ==  (5,32)
 lowestPower 7             ==  (46,70368744177664)
 fst (lowestPower 982)     ==  3973

我试过这个:

lowestPower :: Integer -> (Integer,Integer)
lowestPower n = (k,m)
  where
    k <- [0..]
    (head . cifras) m = n
    2^k = m

cifras :: Integer -> [Integer]
cifras n = [read[d] | d <- show n]

1 个答案:

答案 0 :(得分:2)

k <- [0..]不是您可以在where块中编写的内容。 where阻止 define 的东西,可能取决于封闭范围内的参数,但它们无法处理这种“循环结构”。你也不能使用方程式作为条件,例如(head . cifras) m = n。这两者都更像是逻辑编程,但Haskell是功能性的,即它不解决命题而只是简单地指定函数方程。即所有=行的格式必须为

newVariableOrFunction 〘..arguments..〙 = some expression that can be computed

您可以使用列表理解编写与原始代码非常相似的内容,即您基本上可以明确地量化所有可想到的值。像

lowestPower n = head
  [ (k,m)
  | k <- [0..]
  , let m = 2^k
  , (head . cifras) m == n
  ]

由于列表理解基本上只是实现循环的一种方式,因此通过递归定义函数更为自然。

相关问题