- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想记住如何在懒球拍中进行动态编程。解决了Euler项目的问题之一后,我开始感到奇怪:
从下面的三角形的顶部开始并移至相邻的三角形
在下面的行中,数字从上到下的最大值为23。
3
7 4
2 4 6
8 5 9 3
#lang racket
(define (triangle-ref x y)
(let ((triangle
(vector-immutable
(vector-immutable 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23)
(vector-immutable 63 66 04 68 89 53 67 30 73 16 69 87 40 31)
(vector-immutable 91 71 52 38 17 14 91 43 58 50 27 29 48)
(vector-immutable 70 11 33 28 77 73 17 78 39 68 17 57)
(vector-immutable 53 71 44 65 25 43 91 52 97 51 14)
(vector-immutable 41 48 72 33 47 32 37 16 94 29)
(vector-immutable 41 41 26 56 83 40 80 70 33)
(vector-immutable 99 65 04 28 06 16 70 92)
(vector-immutable 88 02 77 73 07 63 67)
(vector-immutable 19 01 23 75 03 34)
(vector-immutable 20 04 82 47 65)
(vector-immutable 18 35 87 10)
(vector-immutable 17 47 82)
(vector-immutable 95 64)
(vector-immutable 75))))
(vector-ref (vector-ref triangle y) x)))
(define triangle-size 15)
(define (problem18)
(let ((table (let fill-table ((table (hash))
(current-x 0)
(current-y 0))
(cond ((>= current-y triangle-size) table)
((>= current-x (- triangle-size current-y))
(fill-table table 0 (add1 current-y)))
(else (let ((reference (cons current-x current-y))
(triangle-value (triangle-ref current-x
current-y)))
(if (= current-y 0)
(fill-table (hash-set table
reference
(cons triangle-value
empty))
(add1 current-x)
current-y)
(let* ((left-entry (hash-ref
table
(cons
current-x
(sub1 current-y))))
(left-cost (car left-entry))
(left-path (cdr left-entry))
(right-entry (hash-ref
table
(cons
(add1
current-x)
(sub1
current-y))))
(right-cost (car right-entry))
(right-path (cdr right-entry)))
(if (> left-cost right-cost)
(fill-table (hash-set table
reference
(cons
(+ triangle-value
left-cost)
(cons
triangle-value
left-path)))
(add1 current-x)
current-y)
(fill-table (hash-set table
reference
(cons
(+ triangle-value
right-cost)
(cons
triangle-value
right-path)))
(add1 current-x)
current-y))))))))))
(car (hash-ref table (cons 0 (sub1 triangle-size))))))
(problem18)
(provide problem18)
最佳答案
对于某些类型的问题,懒惰可以让您以一种很好的模块化方式来组织解决方案,在这种情况下,您可以首先编写代码,就像生成所有可能的解决方案一样(即使有无限可能),然后分别编写代码以测试是否解决方案是有效的解决方案。在一种懒惰的语言中,这样的算法将仅检查可能的解决方案来计算最终结果,而其他所有可能性自然不会被计算出来,因此它与回溯等更复杂的策略一样有效。
一个典型的例子是解决数独难题的算法(谷歌搜索会出现很多例子)。您可能也对John Hughes的论文《为什么函数编程很重要》感兴趣。
话虽如此,在这种特定情况下,懒惰不会有多大帮助。急切或懒惰的语言中的动态编程风格的解决方案都可以很好地工作(外观大致相同)。
解决此类问题时,先计算一个幼稚的解决方案然后加以改进通常会很有帮助。天真的解决方案将计算每个可能的总数,然后取最大值。对于小三角形示例,您将计算3 + 7 + 2 + 8、3 + 7 + 2 + 5等,但是只要写下来就可以显示出可能的改进,因为重复了3 + 7 + 2。避免这些重复的计算正是动态编程所要做的。动态算法将只计算一次这些中间结果,然后将其重复使用多次。
为此,我们通过逐步计算最大总数,一次计算一行。以这种方式计算最大总数的函数可能如下所示:
(注意:您需要安装最新的每晚版本才能运行此Racket代码。)
;; A Row is a list of at least one number.
;; A Triangle is a list of at least one Row,
;; where each row has one more number than the previous row.
;; ----------------------------------------------------------------------------
;; top-down solution
;; max-tri-route : Triangle -> Number
;; Computes the maximum total when moving from top of triangle to bottom.
(define/match (max-tri-route tri)
[((list a-single-row))
(apply max a-single-row)]
[((list-rest row1 row2 rest-rows))
(max-tri-route (cons (process-row row1 row2) rest-rows))])
;; process-row : Row Row -> Row
;; Takes a list of intermediate maximum values and a row, and incorporates
;; the given row into the intermediate values.
;; - new-row always has one more element than tmp-maxes
;; - produces list of length new-row
(define/match (process-row tmp-maxes new-row)
[((list x) (list y z))
(list (+ x y) (+ x z))]
[((list-rest x rest-maxes) (list-rest y z rest-row))
(define res (process-row rest-maxes (cons z rest-row)))
(cons (+ x y) (cons (max (+ x z) (first res)) (rest res)))])
;; ----------------------------------------------------------------------------
;; bottom-up solution
(define (max-tri-route2 tri) (max-tri/bottom-up (reverse tri)))
;; Computes total starting from bottom row.
(define/match (max-tri/bottom-up tri)
[((list (list the-max-total)))
the-max-total]
[((list-rest row1 row2 rest-rows))
(max-tri/bottom-up (cons (process-row/bottom-up row2 row1) rest-rows))])
;; - tmp-maxes always has one more element than new-row
;; - produces list of length new-row
(define/match (process-row/bottom-up new-row tmp-maxes)
[((list x) (list y z))
(list (+ x (max y z)))]
[((list-rest x rest-row) (list-rest y z rest-maxes))
(cons (+ x (max y z)) (process-row/bottom-up rest-row (cons z rest-maxes)))])
;; ----------------------------------------------------------------------------
;; bottom-up, with foldl
(define (max-tri-route3 tri)
(define rev-tri (reverse tri))
(first (foldl process-row/bottom-up (first rev-tri) (rest rev-tri))))
;; ----------------------------------------------------------------------------
;; bottom-up, with foldr1
(define/match (foldr1 f lst)
[(_ (list x)) x]
[(_ (list-rest x rest)) (f x (foldr1 f rest))])
(define (max-tri-route4 tri) (first (foldr1 process-row/bottom-up tri)))
关于racket - 懒惰 Racket 中的动态编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13188129/
在 JavaScript 中,我们可以动态创建 元素并附加到 部分,以便为大量元素应用 CSS 规则。 这种方法的优点或缺点是什么? 如果它确实提供了与元素上的 javascript 迭代相比的性
我有这个代码 import "./HTTPMethod.dart"; import '../../DataModel/DataModel.dart'; mixin RouterMixin { HT
哪些 OLAP 工具支持动态、动态地创建维度或层次结构? 例如,层次结构将成员定义为:“前 5 名”、“前 6-10 名”、“其他”... 计算成员是通常的答案,我正在寻找不同的东西。计算器的问题。成
我正在 CakePHP 中创建一个“表单编辑器”。 该界面允许用户选择要应用于字段的验证,例如数字、电子邮件等 因此,我需要根据用户输入为模型动态创建验证。为此,我可以使用验证对象:https://b
这是一个场景: 我有一个Web服务,我们将其称为部署在tomcat(轴)上的StockQuoteService。通过此 Web 服务公开了 getStockQuote() 方法。 现在,我想构建一个
我正在尝试从服务器获取 JSON 响应并将其输出到控制台。 Future login() async { var response = await http.get( Uri.
我从另一个问题中得到了这段代码(感谢 chunhunghan)。我需要创建一个登录屏幕,并尝试根据服务器发回给我的响应来验证用户凭据,但是每次我尝试运行代码时,它都会给我“未处理的异常:Interna
当我在“Dart”主程序中运行它时,一切正常,并且我得到了一个与会者列表。但是,当我在我的 Flutter 应用程序中调用它时,出现错误: flutter:“List”类型不是“List>”类型的子类
本文实例为大家分享了js实现验证码动态干扰的具体代码,供大家参考,具体内容如下 效果一 效果二 代码一 ?
目前我正在为我的网站使用 No-Ip,我想使用 cloudflare 来抵御 ddos 和机器人程序。我注意到您需要一个用于 cloudflare 的域。我还搜索了网络,发现了一个叫做 cloud
有没有办法在 Excel VBA 中构建动态 if 语句?基本上我正在尝试创建一个参数化计算,用户将能够输入不同的变量,即 变量 1 “变量 2” “变量 3” 在这种情况下 变量 1 是单元格引用
大家好, 请查看上面的图片,我有两张 table 。在下面代码的第一个表中,我得到了这种格式。 但我想像 Table2 那样格式化,每个合并单元格中的行数是动态的,而且不一样。 有没有办法像table
如何根据我添加的 View 修改标题部分的高度?heightForHeaderInSection在 viewForHeaderInSection 之前被调用我不知道 View 大小,直到我创建它。 最
是否存在在运行时生成 AST/解析树的解析器?有点像一个库,它会接受一串 EBNF 语法或类似的东西并吐出数据结构? 我知道 antlr、jlex 和他们的同类。他们生成可以做到这一点的源代码。 (喜
我在持有汽车制造商的表格上有一个 MultipleChoiceField。我想将我的汽车数据库过滤到已检查的品牌,但这会导致问题。如何动态获取所有 Q(make=...) 语句? 我如何开始:['va
$end = preg_replace($pattern, $replacement, $str); 如何使替换字符串 $replacement 随 $str 中的每次匹配而变化?例如,我想用关联的图
我正在编写一个 VBA 程序,用于过滤表中的值。我试图使其成为一个适用于您提供的所有表格的通用程序。在我的程序中,我必须设置它正在过滤的表的范围:Set rng = dataSheet.Range("
我正在循环一个元素数组,并且我想使用给定的模板递归地显示该元素 然后在该模板内使用带有切换功能的按钮来显示/隐藏给定元素的Child的更深级别模板(Child也是一个元素) 这是我的模板
从客户端(html)发送表单,服务器端通过选择选项之一决定运行哪个函数。 const decideWho = (form) => { const choice = form.choice; c
我有一个具有以下属性的按钮: circle_normal.xml(在 res/drawable 中) circle.xml(在 res/drawable 中)
我是一名优秀的程序员,十分优秀!