gpt4 book ai didi

haskell - Haskell中多参数函数的内存

转载 作者:行者123 更新时间:2023-12-04 07:23:38 25 4
gpt4 key购买 nike

this page 上提供了以下使用内存的函数示例。 :

memoized_fib :: Int -> Integer
memoized_fib = (map fib [0..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)

但是,如果我们想记住一个多参数函数怎么办?例如,我们可以创建一个“乘法斐波那契”,定义为 f(m,n) = m*f(m,n-2) + m*f(m,n-1) .我为这个“乘法斐波那契”函数修改了上面的代码,如下所示:
mult_fib :: Integer -> Int -> Integer
mult_fib mult = (map (m_fib mult) [0..] !!)
where m_fib _ 0 = 0
m_fib _ 1 = 1
m_fib m n = m*(mult_fib m (n-2)) + m*(mult_fib m (n-1))

修改后的函数的运行时间是指数的,即使原始函数是线性的。为什么这种技术在第二种情况下不起作用?另外,如何修改函数以利用内存(不使用库函数)?

最佳答案

正如 Vitus 所说,在您的示例中可以非常简单地完成。这个想法的正确实现:

multFib :: Integer -> Int -> Integer
multFib mult = multFib'
where multFib' = (map m_fib [0..] !!)
m_fib 0 = 0
m_fib 1 = 1
m_fib n = mult * (multFib' $ n-2) + mult * (multFib' $ n-1)

然而,内存并不像你在这里的例子那么强大:它只用于优化单个函数调用,但结果列表通常不会存储在后续调用 multFib 之间。同 mult争论。

为此,您需要对两个参数的记忆化查找进行索引,如下所示:
multFibFullMemo :: Int -> Int -> Integer
multFibFullMemo = \mult n -> memo_table !! mult !! n
where memo_table = [ [m_fib mult' n' | n'<-[0..]] | mult' <- [0..] ]
m_fib _ 0 = 0
m_fib _ 1 = 1
m_fib mult n = m * (multFibFullMemo mult $ n-2) + m * (multFibFullMemo mult $ n-1)
where m = toInteger mult

很明显,如果您打算将它与更大的 mult 一起使用,这将不会有效。参数:它总是需要跳到具有该数字长度的列表。

MemoTrie 等库提供了不受此类问题影响的更复杂的内存。 .

关于haskell - Haskell中多参数函数的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18304725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com