【SICP练习】13 练习1.19



练习1.19

题目中说道斐波那契数中将变换T的n次方应用于对偶(1,0)而产生出来,而现在将T看作T(pq)中p=0和q=1的特俗情况。因此对于对偶(a,b)来说,a—bq+a(p+q),b—bp+aq。而对于T(pq)的平方也就是(T(pq))^2,就像之前的a中往b乘以q和往a乘以(p+q),现在依旧是相当于a中往bp+aq乘以q(bp+aq为上一次迭代中的”b”),往(bq+a(p+q))中乘以(p+q),同样的变换也发生在b中。依次对于T(pq)的平方来说,a—b(2pq+q*q)+a(p*p+q*q+2*p*q+q*q),b—b(p*p+q*q)+a(2pq+q*q)。

而再次通过对比我们发现p’=p^2+q^2并且q’=2pq+q^2。

所以当N为偶数时,我们又可以通过应用变换T(p’q’)来减少计算T^N的一半计算量,因此在这种情况下就可以写出对数步数的斐波那契函数了。代码如下:

(define(fib n)

(define (fib-iter a b p q n)

(cond ((= n 0) b)

((even? n) (fib-iter a b (+ (squarep) (square q))

(+(* 2 p q) (square q)) (/ n 2)))

((odd? n) (fib-iter (+ (* b q) (* aq) (* a p))

(+ (* b p) (* a q)) p q(- n 1)))))

(fib-iter 1 0 0 1 n))

再来一次测试:

(fib 0)

;Value: 0

(fib 7)

;Value: 13

时间: 2024-10-05 04:01:29

【SICP练习】13 练习1.19的相关文章

SICP 1.13

解: 中文 原版 麻蛋的垃圾中文翻译,艹 先证明提示中的: Fib(0)成立,Fib(1)成立,Fib(2)成立,假设Fib(n)成立,则(那两个拉丁字母用x y分别代替): x=(1+sqrt(5))/2, y=(1-sqrt(5))/2 Fib(n+1)=Fib(n)+Fib(n-1)=...=((x+1)*pow(x,n-1)-(y+1)*pow(y,n-1))/sqrt(5) 因为x+1=pow(x,2), y+1=pow(y,2) 所以Fib(n+1)=(pow(x,n+1)-pow(

编译安装LNMP Centos 6.5 x64 + Nginx1.6.0 + PHP5.5.13 + Mysql5.6.19

(来自:http://www.cnblogs.com/vicowong/archive/2011/12/01/2116212.html) 环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:CentOS-6.5-x86_64-minimal.iso 安装步骤: 0.虚拟系统安装 0.1 使用VMware 虚拟机进行安装,进行安装界面 (分配内存必须大于1G,否则不会显示图型安装界面,网络设置使用“桥接模式” 即"Bridged"模式) 0.2 选择

Scrum Meeting 13 -2014.11.19

最近数据库和编译的实验课也开始了,大家晚上的时间直接被砍掉了大部分. 希望大家能顺利完成项目吧.剩下时间也不多了,如果程序还存在一些特别的问题和需要优化修改的地方也应该考虑留到下阶段进行了. Member Today’s task Next task 林豪森 与其他小组商讨整合问题 检测功能完整性,处理整合问题 宋天舒 测试项目功能实现 处理测试结果并对下阶段修改作建议 张迎春 测试项目功能实现 处理测试结果并对下阶段修改作建议 黄漠源 优化代码结构,添加注释 书写项目说明文档 黄敬博 优化代码

Linux内核编译 Ubuntu 14.04.3 server 升级至3.19.8

读书笔记:<Linux内核设计与实现>,原书第3版,陈莉君 康华 译 第2章:从内核出发     2.3节:编译内核 实验: ============================================================ 系统环境:VM虚拟机 Ubuntu 14.04.3 LTS server版 任务:编译安装新的内核 注意:不要跨大版本,我在3.19版本内 耗时:2小时 所有版本的内核: https://www.kernel.org/pub/linux/kernel

黑马程序员_JavaSE学习总结第19天_IO流1

------- android培训.java培训.期待与您交流! ----------  19.01  集合的特点和数据结构总结 HashSet.HashMap.Hashtable判断元素唯一性的方式: 通过对象的hashCode和equals方法来完成元素唯一性 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中. 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true. 如果为true,视为相同元素,不存.如果为false,那么

JavaSE_ IO流 总目录(19~22)

黑马程序员_JavaSE学习总结第19天_IO流119.01 集合的特点和数据结构总结19.02 如何选择使用哪种集合19.03 集合常见功能和遍历方式总结19.04 异常的概述和分类19.05 JVM默认处理异常19.06 try...catch的方式处理异常1(一个异常)19.07 try...catch的方式处理异常2(两个异常)19.08 JDK7针对多个异常的处理方案19.09 编译期异常和运行期异常的区别19.10 Throwable的几个常见方法19.11 throws的方式处理异

JavaSE学习总结第19天_IO流1

19.01  集合的特点和数据结构总结 HashSet.HashMap.Hashtable判断元素唯一性的方式: 通过对象的hashCode和equals方法来完成元素唯一性 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中. 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true. 如果为true,视为相同元素,不存.如果为false,那么视为不同元素,就进行存储. 最终:自动生成hashCode()和equals()即可 Tr

Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片介绍: 从最基础的list索引开始讲起,我们先上一段代码和结果: a = [0,1,2,3,4,5,6,7,8,9] a[:5:-1] #step < 0,所以start = 9 a[0:5:-1] #指定了start = 0 a[1::-1] #step < 0,所以stop = 0 输出: [

13种排序算法详解

0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综合发散而来.比如说作为最基本的排序算法就种类很多,而事实上笔试面试过程中发现掌握的程度很一般,有很多题目,包括很多算法难题,其母题或者基本思想就是基于这些经典算法的,