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 和#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) 我正在尝试实现立方根的牛顿法,但我的函数似乎挂起。我的代码与书中显示的平方根代码几乎相同,并根据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)
我进行了独立测试improve,good-enough?他们似乎给出了正确的答案。有人知道为什么我的代码不终止吗?
我在 Racket 中对sicp包进行此操作,以防产生任何影响。
如果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)
谢谢!
我正在通过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行是如何有效的.
这句话来自SICP,我认为是在讨论编程语言中的指针/引用.
正如我们所看到的,对提供了一个原始的"粘合剂",我们可以用它来构造复合数据对象.图2.2显示了可视化一对的标准方法 - 在这种情况下,由(cons 1 2)形成的对.在这种称为盒子和指针表示法的表示中,每个对象都显示为指向盒子的指针.原始对象的框包含对象的表示.例如,数字框包含数字.一对的盒子实际上是一个双盒子,左边的部分包含(指向)该对的汽车,右边的部分包含cdr.
在这种情况下,这本书正在讨论对(EG(缺点1 2))以及如何表示它们.但是我们也可以使用pair来构造这样的列表:
(缺点1(缺点2'()))
虽然box-and-pointer-notation只是一种符号而且毫无用处,但我认为这看起来很像一个链表.据我了解,链表是一个数据结构,包含一个值和指向另一个链表的指针.话虽如此,我认为缺点可以像链表一样构建.我很困惑:
一对的盒子实际上是一个双盒子,左边的部分包含(指向)该对的汽车,右边的部分包含cdr.
我原本以为指针应该在cdr上,因为如果我们通过对构建一个列表,那将是下一个列表.
我认为这可能是一种不同的指针.在这种情况下,指针到底意味着什么?我知道的唯一指针是c中使用的指针.SICP甚至提到了有关c指针的任何内容吗?
在谈论 Painters 时,SICP 使用定义如下的程序:
(define (segments->painter segment-list)
...
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,文本并没有(还?)说明什么->代表什么。->Scheme中的用法是什么?例如,显示段将被视为画家的“方法”(或者反之亦然)是否是 OOP 风格的事情?我唯一见过这个->符号的地方是在 C 中,当然我们在这里不处理指针,所以我有点不清楚它是如何使用的或它在什么约定中使用。
"程序"一词是否与SICP中的"操作"一词同义?(例如,在下面的章节中.)如果它们不相同,有什么区别和原因?
更具体地说,"复合操作"和"复合程序"之间有什么区别?有没有 ?
这是本书的另一章相关章节:
在我看来,在这些上下文中,SICP中的术语"操作"指的是算术运算(因为到目前为止,在实例中没有使用其他类型的操作 - 无论它们通常是什么).
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