【SICP练习】9 练习1.15



(define(cube x) (* x x x))

(define(p x) (- (* 3 x) (* 4 (cube x))))

(define(sine angle)

(if (not (> (abs angle) 0.1))

angle

(p (sine (/ angle 3.0)))))

大家自己将题目中的代码写入Edwin中,用trace可以追踪p的调用,这种功能在Visual Studio中都有,我也是最近才知道trace的。

(trace-entryp)

;Unspecifiedreturn value

(sine12.15)

[Entering#[compound-procedure 12 p]

Args: 4.9999999999999996e-2]

[Entering#[compound-procedure 12 p]

Args: .1495]

[Entering#[compound-procedure 12 p]

Args: .4351345505]

[Entering#[compound-procedure 12 p]

Args: .9758465331678772]

[Entering#[compound-procedure 12 p]

Args: -.7895631144708228]

;Value:-.39980345741334

由此看来p一共运行了5次。

大家应该都看出来了sine过程是一个递归,因此它的时间和空间复杂度都是O(loga)。每当题目中传入的参数a乘以3时,p的运行次数就会增加一次。大家可以用trace愉快的测试了。

时间: 2024-11-05 17:33:43

【SICP练习】9 练习1.15的相关文章

SICP 习题1.1 -1.15体会

下午没事, 开始做题, 花了3个多小时, 做到了1.15. 主要都花在了14题上, 下界的证明想了1个小时还是无法证明,只能暂时放弃, 明天看看算法导论再尝试下. 1.1 没啥好说的, 就是让你熟悉环境 1.2 没啥好说的, 就是让你转换思维,将中缀思维转换为前缀思维. 这个的确有点反人类.大概也是lisp最让人不爽的吧. 1.3 就是让你熟悉cond使用的,也没啥好说 1.4 有点惊喜, 的确比C语言更牛.运算符和变量函数等价了. 1.5 让大家体会下应用序的副作用. 很久前,刚开始编程就死在

SICP 习题 (2.15)解题总结:区间误差的深入思考

SICP 习题 2.15 是接着 题目 2.14 的, 题目 2.14中提到了Alyssa设计的区间计算模块在并联电阻计算时会出现问题,这个问题是Lem发现的.接着,一个叫Eva的人也发现了这个问题,同时她还有更深入的思考. Eva觉得,如果一个公式可以写成一种形式,其中具有非准确性的变量不重复出现,那么Alyssa的系统产生的区间的限界会更紧一些. 因此,她觉得在计算并联电阻时,公式"1/(1/R1 + 1/R2)"比公式"(R1*R2)/ (R1 + R2)"要

SICP 1.14 1.15

解: 1.14:空间是O(n).步聚不好直接求,根据书中的描述,增长的阶是对某种规模所需资源的粗略度量,比如书中描述斐波那契的树形递归计算需要O(pow((1+sqrt(5))/2,n))步,可以把这个树形递归想像成是一个满二叉树,那么斐波那契的树形递归计算可以近似为O(pow(2,n)).同理,计算硬币组合种类也可以看成是一个满二叉树,树的高度与n有关(最右子树最深),那么步骤数为O(pow(2,n)) 1.15:5次.0.1=x/pow(3,n) 得n=log(3,10*x),调用结束则计算

SICP 锻炼 (2.15)解决摘要:深入思考间隔误差

SICP 2.15 是接着 题目 2.14 的, 题目 2.14中提到了Alyssa设计的区间计算模块在并联电阻计算时会出现故障,这个问题是Lem发现的. 接着,一个叫Eva的人也发现了这个问题.同一时候她还有更深入的思考. Eva认为.假设一个公式能够写成一种形式,当中具有非准确性的变量不反复出现.那么Alyssa的系统产生的区间的限界会更紧一些. 因此,她认为在计算并联电阻时,公式"1/(1/R1 + 1/R2)"比公式"(R1*R2)/ (R1 + R2)"要

【SICP练习】5 练习1.15

练习1.15 (define (cube x) (* x x x)) (define (p x) (- (* 3 x) (* 4 (cube x)))) (define (sine angle) (if (not (> (abs angle) 0.1)) angle (p (sine (/ angle 3.0))))) 大家自己将题目中的代码写入Edwin中,用trace可以追踪p的调用,这种功能在Visual Studio中都有,我也是最近才知道trace的. (trace-entry p)

SICP 找零钱问题背后的思考

问题见SICP P26 此问题的递归方法很简单,类似于背包的思想. 即金额为amount的现金换成n种硬币的种类数 满足循环不变式: count_change(amount,n)=count_change(amount,n-1)+count_change(amount-amount_of_first_coin,n) 递归中止条件是:当a=0,结果为1 a<0,结果为0 当n=0 结果也为0 将上述规则转换为scheme代码,在Drracket中运行 1 #lang racket 2 (defin

C/C++算法竞赛入门经典Page11 例题1-5 三整数排序

题目:输入3个整数,从小到大排序后输出 样例输入: 20 7 33 样例输出: 7 20 33 首先,先声明三个整数a,b,c和一个临时变量t: int a,b,c,t;//1,b,c为三个整数,t为临时变量 输入三个整数: scanf("%d%d%d",&a,&b,&c); 进行3次if判断: 1.如果b>a,则a,b对调 2.如果c>a,则a,c对调 3.如果c>b,则b,c对调 代码: if(b>=a){ t=b; b=a; a=t

1056. 组合数的和(15)

给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字.要求所有可能组合出来的2位数字的和.例如给定2.5.8,则可以组合出:25.28.52.58.82.85,它们的和为330. 输入格式: 输入在一行中先给出N(1<N<10),随后是N个不同的非0个位数字.数字间以空格分隔. 输出格式: 输出所有可能组合出来的2位数字的和. 输入样例: 3 2 8 5 输出样例: 330 code: 1 #include <stdio.h> 2 3 int main() 4 {

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 B

<神无月>作为盛大游戏2017年的全新原创大作,其开发团队在自研实力强大的传世工作室基础之上,还有美树本晴彦等日本一线知名画师及日本游戏音乐大师崎元仁加盟参与制作.目前正在不限号内测中,有很多玩家进入到神无月的世界中. 在神无月中,有着玩家之间切磋的排位赛,其段位主要分为五大段位,从低到高依次为:新兵.菁英.战将.统帅.王者.每个玩家只有从新兵段位慢慢努力,一点点晋级才能到达王者段位.成为一个王者是每一个玩家的追求和心愿. 假设神无月的段位系统如下: 从低到高的段位依次简记为:D.C.B.A.