标签: sicp

我在 SICP 练习 3.16 中看到的每个解决方案似乎都是通过创建超过三对来作弊的。我的理解错在哪里?

SICP 练习 3.16为读者提供了一个计算列表结构中的对数的完整过程:

(define (count-pairs x)
  (if (not (pair? x))
      0
      (+ (count-pairs (car x))
         (count-pairs (cdr x))
         1)))
Run Code Online (Sandbox Code Playgroud)

然后,它要求读者创建由三对组成的列表结构,使该过程返回:

  1. 3
  2. 4
  3. 7
  4. 永远不要回来。

任务#1 和#4 很简单;只需制作一个包含三个元素的普通列表并制作一个循环列表即可。然而,对于任务 #2 和 #4,我见过的每个解决方案似乎都通过创建超过三对来作弊。例如,Scheme Wiki给出了这些:

 (define x '(foo)) 
 (define y (cons x x)) 
 (define str2 (list y)) 
 (count-pairs str2) ; 4 

 (define x '(foo)) 
 (define y (cons x x)) 
 (define str3 (cons y y)) 
 (count-pairs str3) ; 7

 (define second (cons 'a 'b)) 
 (define third (cons 'a 'b)) 
 (define …
Run Code Online (Sandbox Code Playgroud)

scheme list sicp cons

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

SICP 练习 1.8 - 为什么我的函数没有终止?

我正在尝试实现立方根的牛顿法,但我的函数似乎挂起。我的代码与书中显示的平方根代码几乎相同,并根据improve需要修改了函数。

这是我的代码...

(define (cube-root x)
  (cube-root-iter 1.0 x))

(define (cube-root-iter guess x)
  (if (good-enough? guess x)
      guess
      (cube-root-iter (improve x guess) x)
      )
  )

(define (good-enough? guess x)
  (< (abs (- (* guess guess) x)) 0.001))

(define (improve x guess)
  (/ (+ (/ x (* guess guess)) (* 2 guess)) 3)
  )
Run Code Online (Sandbox Code Playgroud)

我进行了独立测试improvegood-enough?他们似乎给出了正确的答案。有人知道为什么我的代码不终止吗?

我在 Racket 中对sicp包进行此操作,以防产生任何影响。

scheme sicp racket

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

Scheme如果对以空格char结尾,结果将在两个元素之间有一个点

如果pair以空格char结尾,为什么结果值包含一个点(.)?这个点(.)是什么意思?

(cons 1 2 )
;Value 2: (1 . 2)

(car (cons 1 2 ))
;Value: 1

(cdr (cons 1 2 ))
;Value: 2
Run Code Online (Sandbox Code Playgroud)

这一个看起来很愚蠢,因为对只包含两个元素.

我只是想知道为什么第一个表达式在结果中回显一个点!

(cadr (cons 1 2 ))
;The object 2, passed as an argument to safe-car, is not a pair.
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.
Run Code Online (Sandbox Code Playgroud)

谢谢!

lisp scheme sicp

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

SICP lisp'if'条件表达式解释

我正在通过SICP工作并参与了关于平方根代码的部分.我理解'if'语句只能跟随单个表达式.但是,在代码中,

(define (sqrt-iter guess x)
    (if (good-enough? guess x)
    guess
    (sqrt-iter (improve guess x)
               x)))
Run Code Online (Sandbox Code Playgroud)

当'guess'和'x'已经被陈述为'if'的结果表达式时,我不明白第3,第4和第5行是如何有效的.

lisp scheme conditional if-statement sicp

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

SICP对指针的描述

这句话来自SICP,我认为是在讨论编程语言中的指针/引用.

正如我们所看到的,对提供了一个原始的"粘合剂",我们可以用它来构造复合数据对象.图2.2显示了可视化一对的标准方法 - 在这种情况下,由(cons 1 2)形成的对.在这种称为盒子和指针表示法的表示中,每个对象都显示为指向盒子的指针.原始对象的框包含对象的表示.例如,数字框包含数字.一对的盒子实际上是一个双盒子,左边的部分包含(指向)该对的汽车,右边的部分包含cdr.

在这种情况下,这本书正在讨论对(EG(缺点1 2))以及如何表示它们.但是我们也可以使用pair来构造这样的列表:

(缺点1(缺点2'(​​)))

虽然box-and-pointer-notation只是一种符号而且毫无用处,但我认为这看起来很像一个链表.据我了解,链表是一个数据结构,包含一个值和指向另一个链表的指针.话虽如此,我认为缺点可以像链表一样构建.我很困惑:

一对的盒子实际上是一个双盒子,左边的部分包含(指向)该对的汽车,右边的部分包含cdr.

我原本以为指针应该在cdr上,因为如果我们通过对构建一个列表,那将是下一个列表.

我认为这可能是一种不同的指针.在这种情况下,指针到底意味着什么?我知道的唯一指针是c中使用的指针.SICP甚至提到了有关c指针的任何内容吗?

c lisp pointers linked-list sicp

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

在 Scheme/SICP 中使用“-&gt;”

在谈论 Painters 时,SICP 使用定义如下的程序:

(define (segments->painter segment-list)
   ...
)
Run Code Online (Sandbox Code Playgroud)

不幸的是,文本并没有(还?)说明什么->代表什么。->Scheme中的用法是什么?例如,显示段将被视为画家的“方法”(或者反之亦然)是否是 OOP 风格的事情?我唯一见过这个->符号的地方是在 C 中,当然我们在这里不处理指针,所以我有点不清楚它是如何使用的或它在什么约定中使用。

lisp scheme sicp racket

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

SICP术语:程序和操作之间的区别

"程序"一词是否与SICP中的"操作"一词同义?(例如,在下面的章节中.)如果它们不相同,有什么区别和原因?

更具体地说,"复合操作"和"复合程序"之间有什么区别?有没有 ?

SICP第1.1.4章复合程序

这是本书的另一章相关章节:

SICP第1.2章程序及其生成的过程

在我看来,在这些上下文中,SICP中的术语"操作"指的是算术运算(因为到目前为止,在实例中没有使用其他类型的操作 - 无论它们通常是什么).

lisp scheme terminology sicp

-4
推荐指数
1
解决办法
1099
查看次数

标签 统计

sicp ×7

scheme ×6

lisp ×5

racket ×2

c ×1

conditional ×1

cons ×1

if-statement ×1

linked-list ×1

list ×1

pointers ×1

terminology ×1