遗憾的是,自从我16岁(GCSE级别)以来,我没有学过数学,现在我是一名27岁的C#开发人员.尝试通过计算机程序的结构和解释(SICP)进行是徒劳的吗?
读者期望什么样的数学标准?
我是clojure的新手,并通过SICP学习.
我无法从SCIP 1.3.1中获得这段代码.
我错过了什么?
(defn sum [term a next b]
(if (> a b)
0
(+ (term a) (sum term (next a) next b))))
(defn sum-cubes-new [a b]
((sum cube a inc b)))
Run Code Online (Sandbox Code Playgroud)
这是错误信息:
java.lang.Integer cannot be cast to clojure.lang.IFn
[Thrown class java.lang.ClassCastException]
Restarts:
0: [ABORT] Return to SLIME's top level.
Backtrace:
0: user$sum_cubes_new__2868.invoke(summation.clj:33)
1: user$eval__2874.invoke(NO_SOURCE_FILE:1)
2: clojure.lang.Compiler.eval(Compiler.java:4642)
3: clojure.core$eval__5236.invoke(core.clj:2017)
4: swank.commands.basic$eval_region__910.invoke(basic.clj:40)
5: swank.commands.basic$eval_region__910.invoke(basic.clj:31)
6: swank.commands.basic$eval__930$listener_eval__932.invoke(basic.clj:54)
7: clojure.lang.Var.invoke(Var.java:359)
8: user$eval__2871.invoke(NO_SOURCE_FILE)
9: clojure.lang.Compiler.eval(Compiler.java:4642)
10: clojure.core$eval__5236.invoke(core.clj:2017)
11: swank.core$eval_in_emacs_package__458.invoke(core.clj:58)
12: swank.core$eval_for_emacs__536.invoke(core.clj:126)
13: clojure.lang.Var.invoke(Var.java:367) …Run Code Online (Sandbox Code Playgroud) 通过计算机程序的结构和解释练习,我一直在慢慢地工作.第1.1.5节讨论了应用程序与正常顺序评估,之后在文本中出现了几次主题.由于解释器使用应用程序顺序评估,因此很容易display在代码中插入调试语句以确切了解其工作原理.能够为正常的订单评估做同样的事情将有助于我的理解.
有没有人知道使用正常顺序评估而不是应用顺序实现的Scheme(或Lisp)解释器?
这是一个简短的例子,修改自SICP中给出的一个例子.我将定义自己的add过程来打印出参数,并使用square本书中的过程.
(define (add x y)
(display x)
(display y)
(newline)
(+ x y))
(define (square x) (* x x))
Run Code Online (Sandbox Code Playgroud)
现在,如果我(square (add 1 2))使用applicative-order评估运行短程序,结果(add 1 2)将只计算一次然后传递给square过程.操作数12应在最终结果之前打印一次.我们可以在解释器中运行它来验证这是发生了什么.
> (square (add 1 2))
12
9
Run Code Online (Sandbox Code Playgroud)
但是,使用正常顺序评估时,(add 1 2)应将单个操作数复制到square过程中,该过程将评估为(* (add 1 2) (add 1 2)).操作数12应在最终结果之前打印两次.
我希望能够在一个执行正常顺序评估的解释器中运行它,以验证它确实是如何工作的.
经过几年的编程,似乎终于攻击SICP了.但是,我不是在Emacs中编辑和运行所有内容,而是使用不同的编辑器和简单的makefile来运行所有练习.这似乎并不完全是正典的,因为我找不到任何像运行文件那样基本的东西,直到"失败".那么我如何在shell上运行Scheme,以便它加载一个文件,按顺序计算每个表达式,并在遇到一个评估为#f或者退出代码为零的语句时终止为非零退出代码.整个文件评估成功?到目前为止最接近解决方案的事情:
$ cat ch1.scm
...
(= 1 2)
$ scheme --load ch1.scm
...
Loading "ch1.scm"... done
1 ]=>
Run Code Online (Sandbox Code Playgroud)
编辑:换句话说,如果其中任何一个表达式评估到ch1.scm加载期间是否有某种方法使评估停止#f?
以下是SICP的练习2.65:
使用练习2.63和2.64的结果给出实现为(平衡)二叉树的集合的union-set和intersection-set的Θ(n)实现.
在"设置为有序列表"一章和练习2.62中,我们已经为有序列表设置了union-set和intersection-set.我在Internet上搜索过,2.65的答案太简单了,它们只是将二叉树转换成列表,仍然使用了有序列表的union-set和intersection-set.
在我看来,我们需要将集合转换为二叉树并重写二叉树的union-set和intersection-set.
那么,我是否误解了SICP练习2.65的含义?还是有一个很好的答案?
我正试图让Scheme继续进行,以便我可以通过"计算机程序的结构和解释",但我一直在讨论上述问题.我知道如何解决问题,但我不知道如何设置bin目录中的文件--library和--edit其他目录.有人可以给我一个想法,如果我应该使用git bash,cmd,文件目录(属性选项)?我查看了属性,但我没有找到如何以这种方式编辑文件.
我正在使用的Scheme版本是MIT-GNU Scheme.
在 Abelson/Sussman 的经典著作《计算机程序的结构和解释》中,在有关树递归和斐波那契数列的第 1.2.2 节中,他们展示了这个图像:
计算第五个斐波那契数时生成的树递归过程

然后他们写道:“请注意,整个计算(fib 3)(几乎一半的工作)是重复的。事实上,不难证明该过程将计算的次数(fib 1)或(fib 0)(上述树中的叶子数,在一般)正是Fib(n + 1)。”
我知道他们正在阐述树递归的观点,以及斐波那契树递归的经典案例如何效率低下,因为递归函数调用自身两次:
用于计算斐波那契数的树递归函数

我的问题是,为什么叶子的数量等于序列中的下一个斐波那契数是显而易见的(即“不难证明”) ?我可以直观地看到情况确实如此,但我没有看到为什么叶数(减少的向下fib 1和fib 0计算)应该是下一个斐波那契数的指标(在本例中为 8,即斐波那契数)之间的联系6,即第6个斐波那契数,即Fib n+1,其中n为5)。
很明显斐波那契数列是如何计算的 - 序列中前两个数字的总和产生当前数字,但为什么叶子的数量恰好等于序列中的下一个数字?那里有什么联系(除了明显的联系之外,事实上,在这种情况下,查看它并将 1 和 0 叶相加确实会产生总计数 8,这是下一个(第 6 个)斐波那契数,等等在)?
我正在阅读SICP,并且作者在计算函数的固定点时研究了平均阻尼技术.我知道在某些情况下,即平方根是必要的,以阻止函数的振荡,y = x/y但我不明白为什么它神奇地帮助定点计算函数的收敛.救命?
编辑
显然,我有点想过这个.我似乎无法理解为什么在重复应用时平均一个函数本身会加速收敛.
在SICP 第1.2.1节中作者给出了如下代码示例,以说明如何使用迭代过程来解决阶乘问题:
(define (factorial n)
(fact-iter 1 1 n))
(define (fact-iter product counter max-count)
(if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
Run Code Online (Sandbox Code Playgroud)
并且说"我们将一个递归过程称为事实 - 因为生成一个迭代过程似乎令人不安.但是,这个过程确实是迭代的:它的状态完全被它的三个状态变量捕获,并且一个解释器需要跟踪只有三个变量才能执行这个过程."
我不明白作者的意思.递归过程和递归过程之间有什么区别?为什么他说下面的递归过程产生一个迭代过程?
计算机程序的结构和解释(SICP)的图3.16和3.17中的方框图和指针图看起来并不相同(纯粹是关于价值,而不是记忆),尽管它们是这样的.("当被认为是一个列表,z1并且z2都代表"相同"列表时,((a b) a b))",第258页)
(define x (list 'a 'b))
(define z1 (cons x x))
(define z2 (cons (list 'a 'b) (list 'a 'b)))
Run Code Online (Sandbox Code Playgroud)
SICP像这样绘制对z1:
和z2像这样:
这对中的箭头z1似乎都没有指向整个对,x.他们甚至没有指出相同的事情,尽管两者都收到了相同的(记忆和价值)对.我会将第一个图表评估为(a b),而第二个图表评估为((a b) a b)
我猜可能每个箭头实际上指向整个对x,但是在第98页的图2.3中:
通过指向侧面或两个项目之间非常清楚地指向整个盒子.
我是否错误地理解了盒子和指针图或其他完全不同的东西?