- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下函数作为本练习的介绍,说明了用加法定义的乘法。这是最简单的“容易写下来”的递归定义。
(define (star a b)
(if (= b 0)
0
(+ a (star a (- b 1)))))
当我看到这一点时,我做的第一件事就是按照之前的练习,编写一个不会破坏堆栈的迭代形式:
(define (star a b)
(star-iter a b 0))
(define (star-iter a counter sum)
(if (= counter 0)
sum
(star-iter a (- counter 1) (+ a sum))))
练习 1.17 鼓励我们找到一个不变量,以减小问题规模,其想法是从 O(n) 到 O(logn) 步数(当执行该特定步骤时,无需执行任何更新结果的事情 - 我们在该步骤中所做的就是减少/转换问题定义 - 这就是“找到不变量”的含义)(参见下面第一个代码块的第 3 行 - 没有添加任何内容导致该步骤)。
对于快速版本,问题说我们应该使用函数halve
和double
,并且似乎暗示这些函数可以作为机器操作使用(恒定时间?)。我已经实现了“快速”版本,只是欺骗了这些函数,如下所示:
(define (fast-star a b)
(cond ((or (= b 0) (= a 0)) 0)
((even? a) (fast-star (/ a 2) (* 2 b)))
(else (+ a (fast-star a (- b 1))))))
迭代形式的相同内容(即 O(1) 空间):
(请注意上面第 4 行中的 + a
如何移动到下面第 6 行末尾的累加器,以将其置于尾部位置)
(define (fast-star b)
(fast-star-iter a b 0))
(define (fast-star-iter a b sum)
(cond ((or (= a 0) (= b 0)) sum)
((even? a) (fast-star-iter (/ a 2) (* 2 b) sum))
(else (fast-star-iter a (- b 1) (+ a sum)))))
所以这是一个“有什么意义”的问题 - 这些函数比上面给出的前两个函数慢。这四个函数中的第一个会破坏堆栈,因此它没有用。但第二个没有。在我的测试中,这个版本比这两个“快速”版本中的任何一个都更快。
我在这里遗漏了什么吗?很好奇是否有一种方法可以实现减半和双倍,以便它们实际上给出此处建议的 log(n) 结果。一定有,否则这个问题就没有意义。
请注意,如果 a 和 b 的大小不同,则它们的顺序很重要 - 例如乘以 2、100 次或 100、2 次,第一个是 100 步,后一个是 2 步。这将是稍后添加到此功能中的内容。但首先对 half
和 double
感到好奇。
最佳答案
您的代码中有一个微妙的错误,这就是它很慢的原因。对于版本 3 和 4,这应该可以解决这个问题:
(define (fast-star a b)
(cond ((or (= b 0) (= a 0)) 0)
((even? b) (fast-star (* 2 a) (/ b 2.0)))
(else (+ a (fast-star a (- b 1))))))
(define (fast-star-iter a b sum)
(cond ((or (= a 0) (= b 0)) sum)
((even? b) (fast-star-iter (* 2 a) (/ b 2.0) sum))
(else (fast-star-iter a (- b 1) (+ a sum)))))
这个想法是在每次迭代中不断添加a
并减少b
,但根据情况有时您会减少 b
有时你会加倍!另请注意,我将 b
除以 2.0
以消除精确算术,这样速度较慢。
当然,您也可以反过来做:添加 b
并减少 a
- 重要的是要一致它,将一个参数的问题减半,并将另一个参数加倍,加倍的参数就是我们需要添加到最终结果中的参数。
关于scheme - SICP Ex。 1.17 - "fast-multiply"比 "multiply"慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62150288/
Elixir 文档 states那个 In addition to the Elixir file extension .ex, Elixir also supports .exs files for
明日方舟TW-EX-5突袭怎么打 TW-EX-5突袭打法详解 关卡难点:开局高压+必须抢夺留声机 必备干员:减速类辅助、夜莺/法抗盾/控制干员 打法思路: 开局扔推王或者其他强力先锋,只
明日方舟TW-EX-6突袭怎么打 TW-EX-6突袭打法详解 关卡难点:抢夺留声机 必备干员:三个先锋,地刺,减速类干员 打法思路 开局左侧扔下桃金娘和先锋,然后马上爆费,在下方扔下第二
明日方舟TW-EX-7突袭怎么打 TW-EX-7突袭打法详解 关卡难点 本关最大的难点就是敌人输出过高,突袭难度情况下高练度重装也扛不住敌人的输出,需要利用箱子的布置还有留声机的输出来解决敌人,
明日方舟TW-EX-8突袭怎么打 TW-EX-8突袭打法详解 关卡难点 关卡的翻车点有两个,一个是注意自爆兵自爆的地点一定要正好,尽量保证其自爆的地方不要波及留声机,否则影响很大,另外就是如何蒸
明日方舟TW-EX-6突袭怎么打 TW-EX-6突袭小火龙单核打法攻略 1、关卡难点 活动开启时间:07月09日16:00-07月30日03:59 关卡开启时间:07月16日16:00-07
所以我一直在研究神圣,它看起来很棒。不幸的是,我没有找到任何像我试图实现的多文件用例示例。 所以我有一个名为configuration.py的文件,它旨在包含不同的变量,这些变量将(使用神圣)插入到代
我说的是Try ... Catch ex as Exception .... End Try 如果我将异常传递给错误记录器,我应该传递异常对象 (ex) 还是 ex.ToString ?传递 ex.T
这是我最近在工作的遗留代码中遇到的一个简单的最佳实践问题。我找不到针对这个特定问题的良好引用,因为我们可以通过多种方式来实现这一目标。但是,我想知道实现这一目标的最佳和最有效的方法。下面我创建了一些发
在 C# 中,年轻的开发人员经常使用“throw ex”而不是“throw”来向父方法抛出异常。 示例: try { // do stuff that can fail } catch (Ex
我们使用下面的脚本作为 EC2 实例的用户数据。我不明白 -ex 选项的用途是什么? #!/bin/bash -ex yum update -y yum groupinstall -y "Web Se
这是 ls -R 命令的输出: .: compare.sh searchByFile.sh startup.sh temp.txt test.sh compare.sh~ search
我真的是编程新手,我正在构建一个关于运动和位置的应用程序。我无法从“词典”中获取特定项目,但“词典”并不是真正的词典。 基本上,我有一个 TableView ,其中包含从我的 Firebase Fir
所以。我正在制作一个论坛,并且我想使用 AngularJS 来构建它。 首先。 现在,我已经通过以下方式建立了与数据库的连接: prepare($sql)){ $query->bind_result(
关于泛型的两个简单问题。 下面两个函数定义是否相同? FunctionA(Exception ex); FunctionB(T ex) where T : Exception; 通用实现 (Funct
MSVC 10 和 MSVC 9 在编译我的异常框架时都生成了 4 级警告消息,尽管程序的行为似乎是正确的。异常框架相当庞大和复杂,但我已经设法将其归结为它的本质。这是一个完整的程序,您可以在 VS1
我的问题是:用 getMessage 或 toString 或两者都记录更好吗?考虑到开源引发的错误。看到评论中的问题,但没有得到答案。也许我错过了什么?不要介意记录其中之一的小性能影响,但除非有充分
当我尝试使用 create-react-app 创建一个新的 React 应用程序时,我得到以下信息: » npx create-react-app my-order Creating a new R
背景 我正在尝试将 2 个单独工作的功能结合起来,但在使它们协同工作时遇到了麻烦。 *1) 如 solr wiki 所述我可以标记一个特定的 fq,然后在我的 facet.field 中排除它。即使在
我正在尝试使用从this website下载的代码来学习 ruby 。 我被困在这一点上。 def test_you_dont_get_null_pointer_errors_when_calli
我是一名优秀的程序员,十分优秀!