标签: sicp

使用Clojure帮助替换模型[Sicp]

我正在研究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)

functional-programming clojure sicp

2
推荐指数
1
解决办法
280
查看次数

SICP练习1.37:我的迭代解决方案得到了正确答案,但在1.38中出错了

我对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)

它返回:

Welcome to DrRacket, version 5.2.1 [3m].
Language: SICP (PLaneT …
Run Code Online (Sandbox Code Playgroud)

lisp scheme sicp racket

2
推荐指数
1
解决办法
359
查看次数

方案中的迭代映射

我正在观看 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需要正确执行延迟评估?

lisp iteration recursion scheme sicp

2
推荐指数
1
解决办法
551
查看次数

什么原因导致Scheme中出现未绑定的变量错误?

我从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".你能解释一下这个错误背后的原因吗?

非常感谢帮助:)

scheme sicp

2
推荐指数
1
解决办法
998
查看次数

迭代函数可以调用自身吗?

在观看下面的 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)

java iteration recursion scheme sicp

2
推荐指数
1
解决办法
423
查看次数

如何在方案中实现 put &amp; get 程序?

我在看sicp 的书。我被困在第 2.4.3 节,数据导向编程和可加性

如文中所述,putget过程的实现在第 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)

scheme sicp

2
推荐指数
1
解决办法
592
查看次数

从命令行使用 SICP 收集球拍

我已经成功安装了 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

scheme sicp racket

2
推荐指数
1
解决办法
1119
查看次数

If 和 cond 作为特殊形式

考虑SICP中的这两段:

\n\n
\n

这种构造称为案例分析,Lisp 中有一种特殊的形式\n 来表示这种案例分析。它称为 cond(\n 代表 \xe2\x80\x9cconditional\xe2\x80\x9d),其用法如下:

\n\n

...

\n\n

这使用特殊形式 if,这是一种受限制的条件类型,\n 当案例分析中恰好有两种情况时可以使用该形式。

\n
\n\n

在这种情况下类型是什么意思(条件的限制类型)?是不是意味着:

\n\n
    \n
  • “if”是“cond”的一种吗?因为句子说“有一种特殊形式”,所以只有一种特殊形式,因为“if”是“cond”的一种类型。
  • \n
  • “if”和“cond”都是无关的。它们都是有条件的。如果这是正确的,为什么这句话说“有一种特殊形式”就像只有一种一样?
  • \n
\n

lisp scheme sicp

2
推荐指数
1
解决办法
372
查看次数

从函数返回函数的目的是什么?

我正在学习 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)

为什么我们真的需要函数作为返回值?抽象?部分应用?我想有一个更简单、更清晰的想法,我们需要它做什么,以及在哪里使用它。谢谢!

lisp scheme sicp higher-order-functions racket

2
推荐指数
1
解决办法
113
查看次数

"Lisp中的引用"的含义

在阅读SICP时出现了这个问题.为什么要(list 'quote '(a b c))由解释(评估R5RSDr.Racket)作为'(a b c).对我来说应该是(quote (a b c)).例如,(list 'quot '(a b c))被评估为(quot (a b c)).有什么特别的'quote

lisp scheme sicp

1
推荐指数
1
解决办法
342
查看次数