【SICP练习】40 练习1.45



练习1.45

如果看到前面的文章,应该知道我喜欢将某个变量n先设成一个固定的数比如3、4什么的。这里我们依旧如此,先来看看如何写出开四次方根的过程。这道题的目的旨在让我们好好回顾前面的内容,毕竟只剩下一道题我们就完完全全的解决了第一章。

下面我来带大家一起回顾一下。fixed-point是以1个函数和一个初始猜测为参数的函数,用来计算不动点。所谓的不动点就是x=f(x)时的点x。比如这个式子,(fixed-point
square 1.0),它会返回1,因为1的平方等于1。

average-damp是一个参数是一个过程f,返回的还是一个过程的函数,其主要是体现了平均阻尼的技术。

而repeated在前面几题中有大量的介绍,不记得的话可以回过头看看。其以一个过程和一个数字为参数,数字为这个过程的重复执行次数。并且它也将返回一个过程。

下面我们就用这些技术来完成开4次方的函数,英文太烂请见谅。所需要的函数都应该先加载。

(define (4-root x)

(fixed-point (repeated (average-damp

(lambda (y)

(/ x (* y y y)))) 10) 1.0))

现在我们可以来测试一下。

(4-root 16)

;Value: 1.9900313055671766

看来效果还是不错的。

下面我们来将开四次方写成一个过程。进展很顺利,一气呵成。

(define 4-root

(lambda (x times)

(fixed-point (repeated (average-damp

(lambda (y)

(/ x (* y yy)))) times) 1.0)))

在我看来比较棘手的是这里的多个y的相乘,因为前面我在嵌套过程的时候真是走了太多弯路。

这里我先将这个过程写出来,如果不太会的话可以先将函数写出来,因为函数和lambda表达式是可以互相转换的。

(define multi-self

(lambda (n times)

(if (= times 1)

n

(* n (multi-self n (- times 1))))))

有了以上这些积累就可以完成下面这个过程了。

(define n-root

(lambda (n x times)

(fixed-point (repeated (average-damp

(lambda (y)

(/ x (multi-self y (- n 1)))))times) 1.0)))

我在一开始测试4次方的时候Edwin一直没有反应而且风扇呼呼的转,知道我将times弄得大点,原来是平均阻尼不足以让不动点搜寻收敛。

时间: 2024-10-23 11:25:32

【SICP练习】40 练习1.45的相关文章

SICP 1.40 1.41 1.42 1.43 1.44

解:1.40 (define (cubic a b c)   (lambda (x) (+ (* x x x) (* a x x) (* b x) c))) 1.41 (define (double f)   (lambda (x) (f (f x)))) (double double) => (double (double f)),则 (double (double double)) => (double (double (double (double f)))) 把inc代入f,得(((d

SICP:2.40 2.41

#lang racket (define (accumulate op initial seq) (if (null? seq) initial (op (car seq) (accumulate op initial (cdr seq)))) );accumulate (define (append lst1 lst2) (if (null? lst1) lst2 (cons (car lst1) (append (cdr lst1) lst2))) );append (define (enu

Oracle静默安装

测试CentOS 6.5_x64下静默安装Oracle 11g R2数据库 [一.下载地址] http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html Oracle 11g 联机文档: http://www.oracle.com/pls/db112/homepage [二.系统要求] 内存:1G(官方最低要求1G) 硬盘:40G(企业版安装所需4.29G和1.7G数据文件) 检查的命令 内

d3系列2--api攻坚战02

<html> <head> <style type="text/css"> .area{ fill:steelblue; } </style> <title></title> </head> <body> <script src="js/d3.v3.min.js" type="text/javascript" charset="utf-

python实现打印九九乘法表

>>> def minus(): ... x = 0 ... y = 0 ... while(x <= 9): ... while(y <= 9): ... if(y == 4): ... print x,"*",y,"=",x*y ... else : ... print x ,"*",y,"=",x*y,' ', ... y = y + 1 ... print ... x = x+1 ...

[TS36.523-1]:7.1.1.1

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin-top: 0in; margin-right: 0in; margin-bottom: 8.0pt; margin-left: 0in; line-height: 107%; font-size: 11.0pt; font-family: "Calibri", sans-serif } h5 { margin-top: 2.0pt; margin-right: 0in; margin-lef

hive操作语句使用详解

#创建表人信息表  person(String name,int age) hive> create table person(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE; OK Time taken: 0.541 seconds#创建表票价信息表 ticket(int age,float price) hive> create tab

10.3 noip模拟试题

希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“前进栈”,从“后退栈”中取出栈顶页面,并设置为当前页面.FORWARD: 如果“前进栈”为空则忽略此命令.否则将当前两面压入“后退栈”,从“前进栈”中取出栈顶页面,并设置为当前页面.VISIT: 将当前页面压入“后退栈”. 并将当前页面置为指定页面, 并将“前进栈”置空.QUIT: 退出.假设此浏览

DES加解密算法的简单实现

前几天刚写完一个简单的DES算法的实验,拿来作为第一次发到博客的随笔,填充一下空空如也的博客,献丑了 因为主要目的是Easy-To-Understand,再现一个直观的DES加解密的过程,所以很浪费地每一个数据位都用一个short整型存储,用来理ying解fu过zuo程ye就好(虽说DES这种对称加密算法十多年前就已经被淘汰了,现在一般建议用AES或者DES3 “1973 年,美国国家标准局(NBS)开始征集一种标准的数据加密标准算法(DES),以用于非机密性政府机构.商业部门和民间的对非机密的