当前位置: 首页 > 知识库问答 >
问题:

Haskell记忆码与阶乘n的尾随零数

沈华晖
2023-03-14

我试图解决代码战问题,称为:N的尾随零的数量!和哈斯克尔。我知道我不需要计算阶乘来知道尾随零,事实上我只是计算有多少个数字可以被5整除,以及每个数字可以被5整除多少次。我写了两个版本,一个版本在对一个数字进行去噪时使用回忆录,以得到可以被5整除的次数,另一个版本不使用回忆录。令我惊讶的是,假设的DP方法比普通的递归方法耗时更长。我可能在代码中做了一些非常愚蠢的事情。

以下是功能:

zeros x = helperZeros [1..x]
helperZeros :: [Integer] -> Integer
helperZeros  = sumArrayTuple . filter (\x -> x `mod` 5 == 0)
sumArrayTuple = foldl (\acc x -> acc + (fastDef x)) 0
data Tree a = Tree (Tree a) a (Tree a)
instance Functor Tree where
  fmap f (Tree l m r) = Tree (fmap f l) (f m) (fmap f r)
index :: Tree Integer -> Integer -> Integer
index (Tree _ m _) 0 = m
index (Tree l _ r) n = case (n-1) `divMod` 2 of
  (q,0) -> index l q
  (q,1) -> index r q
nats = go 0 1
  where
    go n s = Tree (go l s') n (go r s' )
      where
        l = n + s
        r = l + s
        s' = s * 2
fastDef:: Integer -> Integer
fastDef x = trace (show x) index memTreetDef x
memTreetDef = fmap (defact fastDef) nats
defact f n
  | n `mod` 5 /= 0 = 0
  | otherwise =  1 + f (n `div` 5)



zeros' x = helperZeros' [1..x]
helperZeros' :: [Integer] -> Integer
helperZeros'  = sumArrayTuple' . filter (\x -> x `mod` 5 == 0)
sumArrayTuple' = foldl (\acc x -> acc + (def x)) 0
def n
  | n `mod` 5 /= 0 = 0
  | otherwise = 1 + def (n `div` 5)

我试图记下的是默认函数的结果,例如,如果我已经计算了默认值200,那么它会重用这个结果来计算默认值1000。

我对哈斯克尔的DP相当陌生。

共有1个答案

田成仁
2023-03-14

如果您在此处使用trace和show测试代码性能,这就是问题所在:它们与主代码相比非常慢。否则,变体的性能必须大致相同。

def功能不适合记忆。递归的平均深度与1相差不大。其余的复杂度降低到操作mod,也就是说,除法几乎不比查表更昂贵(常数除法可以优化为乘法)。

 类似资料:
  • 问题内容: 我正在尝试计算阶乘产生的数字的尾随零(这意味着数字变得很大)。以下代码采用一个数字,计算该数字的阶乘,并计算尾随零。但是,当数字大约为25!时,numZeros将不起作用。 我并不担心这段代码的效率,并且我知道有多种方法可以使这段代码的效率更好。我要弄清楚的是为什么计数大于25的数字结尾的零!不管用。 有任何想法吗? 问题答案: 您的任务不是计算阶乘,而是计算零的数量。一个好的解决方案

  • 我是C编程新手,我想找出给定数的阶乘中尾随零的数量 我尝试计算数字的模,它将返回给定数字的最后一位作为余数,然后将删除最后一个数字。 执行程序后,输出总是将尾随零的数量显示为“0”,如果(ln=!0)条件始终得到满足,即使存在零。

  • 我试图计算给定数字的阶乘中尾随零的数量,例如。, ,其中尾随零 ,其中尾随零 我的问题是,我有一个像df这样的数据帧 我知道R中的阶乘是用来计算阶乘的,但我不知道如何计算尾部的零。任何帮助都将不胜感激!

  • 当我提交给leetcode时,它运行案例500/502,但失败了,原因是:1808548329。但当我在自己的mac上运行它时,它给出了与公认的答案相同的答案。 我的代码: 交流答案是: 它们在我的mac上运行相同的结果: 第一个解决方案之所以不被接受,是因为时间复杂度 (因为我在自己的mac上运行它,但它给出了与ac相同的答案) 如何计算第一个解决方案的时间复杂度, 它是O(NlogN)吗?我不

  • 我需要以下问题的帮助。 给定一个整数m,我需要求正整数n和整数的个数,使得n的阶乘以m的零结束。 我写了这段代码,它运行良好,我得到了正确的输出,但随着数字的增加,它花费了太多的时间。 有人能给我一个更有效的方法来做到这一点吗?目前,一个测试用例需要30秒来询问阶乘中带有尾随零的数字。 谢谢

  • 我试图计算阶乘中尾随零的数量。 我认为尾随零的数量不正确。 使用计数(30)时,30中有7个尾随的0。然而,它正在返回6。