haskell 如何才能最大限度地提高该功能的效率?

envsm3lx  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(130)
encrypt k iv x  = encrypt [] x iv k
    where 
        go _ [] _ _  = []
        go [] x iv k = go [add (add (head x) iv) k] x iv k
        go c x iv k
            | length x == length c = c
            | otherwise            = go (c ++ [add (add (x !! length c) (last c)) k]) x iv k

我想知道这个函数是否被认为是尾递归的。根据定义,我们被分配去实现的方法是递归的。但是,为了让它更有效,我尝试让它尾部递归。我的逻辑是错的吗?我认为这是尾递归,而且效率更高。
我还想知道上面的实施是否比下面的先前实施更有效:

encrypt k iv x = [ go x i iv k | i <- [0..n] ]
    where
        go x 0 iv k  = add (add (x !! 0) iv) k
        go x i iv k  = add (add (x !! i) (encrypt x (i - 1) iv k)) k
        n                 = length x - 1

我假设,由于每个新元素都必须返回到第一个元素,这将是非常低效的。我的主要目标是使这个功能尽可能有效。

u5rb5r59

u5rb5r591#

如果我阅读这段代码是正确的,几乎可以肯定的是,这两种方法都比这一种方法差:

cbcEncrypt k iv [] = []
cbcEncrypt k iv (x:xs) = iv' : cbcEncrypt k iv' xs where
    iv' = add (add x iv) k

我对我的效率评估很有信心,但我可能没有正确地阅读代码,所以您应该自己阅读并验证它是否执行了正确的计算。
这也可以写成扫描。

cbcEncrypt k iv0 = tail . scanl (\iv x -> add (add x iv) k) iv0

相关问题