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
我假设,由于每个新元素都必须返回到第一个元素,这将是非常低效的。我的主要目标是使这个功能尽可能有效。
1条答案
按热度按时间u5rb5r591#
如果我阅读这段代码是正确的,几乎可以肯定的是,这两种方法都比这一种方法差:
我对我的效率评估很有信心,但我可能没有正确地阅读代码,所以您应该自己阅读并验证它是否执行了正确的计算。
这也可以写成扫描。