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 (fermat-test start)

(prime-test-iter (+ start 1) end)

false)))

(define (fermat-test a)

(= (expmod a n n) a))

(define (expmod base exp m)

(cond ((= exp 0) 1)

((even? exp)

(remainder (square (expmod base (/ exp 2) m))

m))

(else

(remainder (* base (expmod base (- exp 1) m))

m))))

(prime-test-iter 2 (- n 1)))

1.28 主要是要理解条件, 对1.27的fermat-test函数做修改

关键是下面代码

(define (square-with-check base x)

(define (remainder-check base r)

(if (and (= r 1)

(not (= base 1))

(not (= base (- n 1))))

0

r))

(remainder-check x (remainder (square x) n)))

完整代码如下:

(define (prime-test n)

(define (prime-test-iter start end)

(if (> start end)

true

(if (fermat-test start)

(prime-test-iter (+ start 1) end)

false)))

(define (fermat-test a)

(= (expmod a (- n 1)) 1))

(define (expmod base exp)

(cond ((= exp 0) 1)

((even? exp)

(square-with-check base (expmod base (/ exp 2))))

(else

(remainder (* base (expmod base (- exp 1)))

n))))

(define (square-with-check base x)

(define (remainder-check base r)

(if (and (= r 1)

(not (= base 1))

(not (= base (- n 1))))

0

r))

(remainder-check x (remainder (square x) n)))

(prime-test-iter 2 (- n 1)))

时间: 2025-01-08 14:35:39

SICP 1.27 1.28体会的相关文章

WCF 入门(25,26,27,28)

前言 项目赶时间,工期紧,熬过这段时间应该就好了吧.希望如此. 今天把自己那部分写的差不多了,回来和小伙伴一起又看了一遍<夏洛特烦恼>,还挺好看的,明天继续加班,do it. 第25-28集 第25集讲的是如何用winform来host 一个WCF service. 第26集讲什么是windows 服务 第27集讲用windows 服务来host 一个WCF service. 第28集讲用windows 服务来host 一个WCF service的优缺点. 用console,winform 或

习题 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

EC读书笔记系列之14:条款26、27、28、29

条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ---------------------------------------------------------------------- 举例说明: std::string encryptPassword( const std::string &password ) { using namespace std; string encrypt

Effective C++ 26,27,28

26.当心潜在的二义性. 一些潜在的二义性的例子: class A{ public: A(const B&); }; class B{ public: operator A() const; }; void f(const A&); 一般情况下,这样写不会出错,但当调用f函数传入一个 B的对象b时,就会发生二义性错误,b既可以通过A的构造函数获得一个A的对象,也可以通过B的类型转换运算符来将b变成一个A的对象再使用,而编译器不知道应该使用哪种方法.这是一个潜在的二义性,其一般情况下正常无误

4月27日--28日课堂内容

语句 语句的分类 * 一.顺序语句 * 二.分支语句(选择语句) * 三.循环语句 二.选择语句(分支语句/条件语句)  if  else 1.定义 if是如果的意思,else是另外的意思,if后面跟()括号内为判断条件,如果符合条件则进入if语句执行命令.如果不符合则不进入if语句.else后不用加条件,但是必须与if配合使用,else后也可加if,但if后需要条件.If-else可以嵌套. 2.格式 (1)格式1: if (…) //括号内是判断条件 { //程序代码,运算等等 } (2)格

冲刺阶段第八天,4月26,27,28日。

这三天做的事: 整合代码比想象中的要难,每日抽出一个多小时,将近四个小时才完成的工作.不仅添加了注释,还把各个窗口串在了一起,微调了界面. 数据库连接部分在运行前连接一次,避免登录时卡顿. 明天要做的事: Table表在第一次声明后再次调用,虽然显示的事第二次的数据,但切换页面再切换回来,就回到了第一次的样子.

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.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-

SICP 习题1.16-1.19体会

首先反思一下, 昨天做1.14的时候犯了一个严重错误,思维定式了,导致花了很多无用功. 1.14的关键是要想到2个物理意义. 一个是广度优先, 也就是只考虑问题递归树的第一层子数.那么必然有公式 F(n,m) = F(n- c1, m) + ... + F(n-cm, m) + 1   c1..cm为货币价值, m为货币树. 利用这个公式,我们很容易用数学归纳法证明存在一个参数C1,满足F(n,m) > C1 * n的m次方. 但是,利用这个公式,我们是无法证明存在一个参数C2,满足F(n,m)