SICP 1.21 1.22 体会

1.21 简单的将书上代码敲了一遍。 非常顺利就过了。

1.22 就悲剧了。

先按书本的意思。代码非常快就写完了。但计算的时间在机子上漂浮不定。 3-5倍之间。

代码例如以下:

(define (search-for-primes start end count)

(define (timed-prime-test n)

(newline)

(display n)

(start-prime-test n (runtime)))

(define (start-prime-test n start-time)

(if (prime? n)

(report-prime (- (runtime) start-time))

0))

(define (report-prime elapsed-time)

(display " *** ")

(display elapsed-time)

1)

(define (prime? n)

(= n (smallest-divisor n)))

(define (search-iter start end count)

(if (or (> start end) (= count 0))

0

(if (= (timed-prime-test start) 1)

(search-iter (+ start 1) end (- count 1))

(search-iter (+ start 1) end count))))

(search-iter start end count))

问题就悲剧在。我想换一种想法。

一般常见的project測试代码都是例如以下风格:

记录開始时间

调用函数

计算结束时间

于是,我非常悲剧地写了以下代码

(print-test-time   (runtime)  (search-iter start end count)  (runtime))

却惊奇的发现前后2次计算的时间竟然全然一样。

再认真将书从头看了一遍, 我晕, 这本书最重要的东西竟然没讲。 函数的參数究竟按什么顺序求的?

google了一下,晕, 竟然是依赖编译器确定。

也就是说不知道。

对于一般状态无关的參数的确没有问题。 但对于时间依赖的參数就悲剧了。

再回过头来思考计算模型, 发现这本书更大的问题。

对什么东西能做操作符,什么东西能做操作数竟然全然没有给出清晰的定义。

1和1.0, 1/1, true, 究竟是不是一回事,书本也全然没讲清楚。

作为讲编程语言的书来说。 这本书真是一塌糊涂。

上面的函数 (timed-prime-test n) 有3个语句, 概念进入得非常突入, 这3个语句运行按什么顺序呢? 返回值是哪个呢? 基本上靠读者去猜。

(本人猜的是从上往下运行,返回最后一个语句 ,可是不是程序确实是这样还不大自信)

(newline)

(display n)

(start-prime-test n (runtime)))

时间: 2025-01-11 08:38:49

SICP 1.21 1.22 体会的相关文章

SICP 1.21 1.22 1.23 1.24

解:相关代码如下,时间测不出来 #lang racket (define (square x)   (* x x)) (define (smallest-divisor n)   (define (divides? a b)     (= (remainder b a) 0))   (define (next divisor)     (if (= divisor 2)         3         (+ divisor 2)))   (define (find-divisor n tes

SICP 习题 (2.22)解题总结: 迭代过程中的列表处理

SICP 习题 2.22是习题2.21的后续题目,题目中讲到叫Louis Reasoner的人想重写suqare-list过程,希望使用迭代计算过程,而不是递归计算过程,有关迭代计算过程和递归计算过程,如果你没什么印象了,请翻回习题1.9 的解题总结看看. 那个叫Louis Reasoner的人写的迭代版的suqre-list是这样的: (define (square-list-revert items) (define (iter things answer) (if (null? thing

例题 2-1 aabb 2-2 3n+1问题

例题2-1  aabb 输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等) #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv[]) { int i, j, n; double m; for(i = 1; i <= 9; i++) for(j = 0; j <= 9; j++) { n = i*1100 + j*1

习题 2-1 位数 2-2 水仙花数 2-3 韩信点兵 2-4倒三角形 2-6 调和级数 2-7近似计算 2-8 子序列的和

2-1 位数 #include<stdio.h> #include<math.h> int main () { int n; for (n=100; n<=999; n++) { if(n == pow(n/100,3) + pow(n/10%10,3) + pow(n%10,3) ) printf("%d\n",n); } system("PAUSE"); return EXIT_SUCCESS; } 2-2 水仙花数 #includ

SICP 1.34-1.39习题体会

1.34 代入法, 报错, 2不能作为操作符 1.35 证明比较简单,因为它为方程的根.代码也就是将书本代码重写一遍. (define (fix-point f first-guess) (define tolerance 0.00001) (define (close-enough? v1 v2) (< (abs (- v1 v2)) tolerance)) (define (try guess) (let ((next (f guess))) (if (close-enough? guess

SICP 1.27 1.28体会

这2题目, 还算比较简单. 做了3天的题,最大的痛苦就是还不大会调试, 所有代码均靠大脑分析,太痛苦了. 最坑的就是, 经常漏函数参数, load的时候系统也不报错, 运行时的错误提示又如同天书, 看来还是先要找本讲scheme的书先学习下,否则效率太低了. 1.27 主要是写个迭代代码, 测试所有2到n-1.代码如下: (define (prime-test n) (define (prime-test-iter start end) (if (> start end) true (if (f

Linux命令(2017年9月21日 22:19:29)

cd ==change directory 作用切换路径,例如:cd /*** touch   ==摸一下,作用是创建文件.例如:touch ellon.txt vim ==复杂编辑器,相当于emeditor,editplus,notepad++ echo     ==打印输出内容,配合">"或">>" 可以为文件覆盖及追加内容 eg: echo "ellon yeison">ellon.txt cat ==查看文件内容

Linux中的 man 命令(2017年9月21日 22:41:20)

输入q,回车就退出: 输入man man,会详细告诉你man手册的使用方法: man手册是学习linux中经常用到的东西 使用方法: 1. man的查询后面的数字含义: 1)  用户在shell换机中可以操作的指令或可执行文件 2)  系统核心可乎叫的函数与工具 3)  一些常用的函数(function)与函数库(library),大部分为c的函数库(libc) 4)  硬件文件说明,通常是/dev/的文件 5 )  配置文件或者是某些档案的格式 6) 游戏(games) 7) 惯例与协议等,例

leetcode练习:2017/09/21~09/22

Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Note:The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows. var min_32 = 1<<31