- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用动态规划在 Haskell 中解决背包问题。我的第一次尝试是构建一个二维表。但是当输入很大时(例如100 * 3190802表),内存很容易被炸毁。
知道任何给定的行 i
仅取决于行 (i - 1)
,因此我编写了一个函数,希望能够利用尾递归:
import Data.Vector (Vector, (!))
import qualified Data.Vector as V
-- n items, k capacity, vs values, ws weights
ans:: Int -> Int -> Vector Int -> Vector Int -> Int
ans n k vs ws =
let row = initRow k vs ws
in row ! k
initRow :: Int -> Vector Int -> Vector Int -> Vector Int
initRow k vs ws = itbl 1 $ V.replicate (k + 1) 0
where n = V.length vs
itbl i row
| i > n = row
| otherwise = itbl (i + 1) $ V.generate (k + 1) gen
where gen w =
let w_i = ws ! (i - 1)
no_i = row ! w
ok_i = row ! (w - w_i) + (vs ! (i - 1))
in
if w < w_i then no_i
else max no_i ok_i
如代码所示,itbl
递归地调用自身,并且不会对其返回值进行进一步的计算。然而,我仍然看到 top
中的内存在不断增长:
VIRT PID USER PR NI RES SHR S %CPU %MEM TIME+ COMMAND
1214m 9878 root 20 0 424m 1028 S 40.8 85.6 0:16.80 ghc
代码中是否有任何内容阻止编译器为尾递归生成优化代码?
--
最佳答案
这是一个严格性问题。调用 generate
中的
| otherwise = itbl (i + 1) $ V.generate (k + 1) gen
实际上并没有强制向量进入内存。
您可以导入 Control.DeepSeq
并用深度严格的应用程序 $!!
替换 $
:
| otherwise = itbl (i + 1) $!! V.generate (k + 1) gen
或者您可以使用未装箱的向量(这可能更快),方法是将导入语句更改为
import Data.Vector.Unboxed (Vector, (!))
import qualified Data.Vector.Unboxed as V
(并将其他所有内容保留在原始程序中)。
关于haskell - 有什么阻碍优化尾递归吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17346161/
我有一个数据 GridView ,如下所示。在 CellEndEdit 事件中,它会更新 MySql 数据库中的表格 - 但前提是您单击另一个单元格,而不是在您按下回车键、制表符、向下箭头等时。 Da
该应用程序是在 Spring Boot 2.0.1 上开发的。我添加了下一个依赖项以便能够使用 JavaMelody - dependency("net.bull.javamelody:javamel
我应该使用 javascript 进行 json 调用: var arr = { username: "user@user.com", password : "mypassword" , portfo
我的症状与 https://forums.aws.amazon.com/message.jspa?messageID=580990#580990 相同但在 EB Docker 预配置 Python 上
我是一名优秀的程序员,十分优秀!