我正在研究sicp书,我对程序的替换模型有疑问:
(defn A
[x,y]
(cond (= y 0) 0
(= x 0) (* 2 y)
(= y 1) 2
:else (A (- x 1) (A x (- y 1)))))
Run Code Online (Sandbox Code Playgroud)
该程序是练习1.10的一部分.如果我使用以下参数(A 1 10)在REPL中运行该函数,结果为1024.我决定使用替换模型验证结果,但结果是2048.
这是我写的替代模型.有些不对劲,但我不知道是什么.
(A 1 10)
(A (- 1 1) (A 1 (- 10 1))))
(A 0 (A 1 9)))
(A 0 (A (- 1 1) (A 1 (- 9 1)))))
(A 0 (A 0 (A 1 8))))
(A 0 (A 0 (A (- 1 1) (A 1 (- 8 …Run Code Online (Sandbox Code Playgroud) 我对SICP 1.37的迭代解决方案是
(define (con-frac n d k)
(define (iter i result)
(if (= 1 i)
result
(iter (- i 1) (/ (n i) (+ (d i) result)))))
(iter k (/ (n k) (d k))))
(con-frac (lambda (i) 1.0) (lambda (i) 1.0) 11)
(define (euler-d i)
(if (= 2 (remainder i 3))
(* (/ 2 3) (+ i 1))
1))
(define (e)
(+ 2 (con-frac (lambda (i) 1.0) euler-d 9)))
(e)
Run Code Online (Sandbox Code Playgroud)
它返回:
Run Code Online (Sandbox Code Playgroud)Welcome to DrRacket, version 5.2.1 [3m]. Language: SICP (PLaneT …
我正在观看 SICP 视频讲座,我来到了一个部分,其中导师正在展示使用列表的程序,因此,这是其中之一:
(define (map p l)
(if (null? l)
(list)
(cons (p (car l))
(map p (cdr l)))))
Run Code Online (Sandbox Code Playgroud)
我想问的是:有没有办法以map迭代方式定义,或者cons需要正确执行延迟评估?
我从SICP开始,我是Scheme的新手.我已经尝试调试这段代码,甚至将它与类似的解决方案进行了比较.
(def (myFunc x y z)
(cond ((and (<= x y) (<= x z)) (+ (* y y) (* z z)))
((and (<= y x) (<= y z)) (+ (* x x) (* z z)))
(else (+ (* x x) (* y y)))))
Run Code Online (Sandbox Code Playgroud)
此函数返回两个最大数字的平方和.
当我运行它时,解释器给出"; Unbound变量:y".你能解释一下这个错误背后的原因吗?
非常感谢帮助:)
在观看下面的 MIT 6.001 课程视频时,教师在 28:00 将此算法标记为迭代。但是,在 30.27,他说这个算法和实际的“递归”算法都是递归的。该函数使用基本情况调用自身,那么这个迭代如何?
https://www.youtube.com/watch?v=dlbMuv-jix8&list=PLE18841CABEA24090&index=2
private int iterativeSum(int x, int y)
{
System.out.println("x "+x+" y "+y);
if(x == 0)
{
return y;
}
return iterativeSum(--x, ++y);
}
Run Code Online (Sandbox Code Playgroud) 我在看sicp 的书。我被困在第 2.4.3 节,数据导向编程和可加性。
如文中所述,put和get过程的实现在第 3 章(第 3.3.3 节)中给出。但是我没有找到这些程序,也许那里的程序名称会有所不同。
因此,当我尝试运行书中给出的代码(示例)时,repl 抛出了如下错误:
1 ]=> (make-from-mag-ang 4 5)
;Unbound variable: get
;To continue, call RESTART with an option number:
; (RESTART 3) => Specify a value to use instead of get.
; (RESTART 2) => Define get to a given value.
; (RESTART 1) => Return to read-eval-print level 1.
Run Code Online (Sandbox Code Playgroud)
这是代码:
(define (attach-tag type-tag contents)
(cons type-tag contents))
(define (type-tag datum)
(if (pair? datum) …Run Code Online (Sandbox Code Playgroud) 我已经成功安装了 DrRacket 的 SICP 包;我通过使用incGUI 中的操作符对其进行了测试。我按照这里的说明进行操作。
但是,当我racket在 bash 中运行时,使用inc运算符会出现错误。
欢迎使用 Racket v6.6。
>(包括 42)
公司:未定义;无法引用未定义的标识符上下文...:/usr/share/racket/collects/racket/private/misc.rkt:88:7
显然,我没有正确安装它。那我该怎么办?
编辑 1:此外,对于 DrRacket 的 GUI 和bash ,1+和-1+运算符都会给出类似的错误。racket
考虑SICP中的这两段:
\n\n\n\n\n这种构造称为案例分析,Lisp 中有一种特殊的形式\n 来表示这种案例分析。它称为 cond(\n 代表 \xe2\x80\x9cconditional\xe2\x80\x9d),其用法如下:
\n\n...
\n\n这使用特殊形式 if,这是一种受限制的条件类型,\n 当案例分析中恰好有两种情况时可以使用该形式。
\n
在这种情况下类型是什么意思(条件的限制类型)?是不是意味着:
\n\n我正在学习 SICP,但我并没有完全理解函数返回背后的想法。
(define (deriv g)
(lambda (x)
(/ (- (g (+ x dx)) (g x))
dx)))
Run Code Online (Sandbox Code Playgroud)
上面的代码将用作((deriv square) 10),为什么我们不能让这段代码更简单呢?通过在 1 步中评估结果?
(define (deriv g x)
(/ (- (g (+ x dx)) (g x))
dx))
Run Code Online (Sandbox Code Playgroud)
为什么我们真的需要函数作为返回值?抽象?部分应用?我想有一个更简单、更清晰的想法,我们需要它做什么,以及在哪里使用它。谢谢!
在阅读SICP时出现了这个问题.为什么要(list 'quote '(a b c))由解释(评估R5RS在Dr.Racket)作为'(a b c).对我来说应该是(quote (a b c)).例如,(list 'quot '(a b c))被评估为(quot (a b c)).有什么特别的'quote?