SICP第一章:构造过程抽象(1.2)

1.2过程与它们所产生的计算

1.2.1线性的递归和迭代

1.线性递归

求n!的值:

(define (factorial n)
	(if (= n 1)
		1
		(* n (factorial (- n 1)))))
		
(factorial 6)

计算过程:
在这里插入图片描述
从这个计算过程可以看出,是先增长后收缩。并且是随着给定数n的值的增加,增长就会越大。解释器所要维护的运算链条就会越长,占用的空间会变大也耗时。但好处是我们可以不费力的刻画出问题的计算过程。线性递归具有很强的层次性。
时间=0(n)),正比于n
空间=0(n) 正比于n

2.线性迭代

求n!的值:

(define (factorial n)
	(fact-iter 1 1 n))
(define (fact-iter product counter max-count)
	(if (> counter max-count)
		product
		(fact-iter (* counter product)
					   (+ counter 1)
					   max-count)))
					   
(factorial 6)

计算过程:
在这里插入图片描述
可以认为迭代把计算过程储存在了变量 product counter max-count。在计算的每一步只需要保证 product ,counter, max-count是当前值,就能正确运行。哪怕在某一步暂停做了其他的事,只要保证了储存过程的变量的当前值不变,仍然可以正确运行。计算时所需的计算步骤随着n线性增长。
时间=0(n)),正比于n
空间=0(1) 这个计算过程所消耗的空间是固定不变的,即与1成正比

3.递归过程

当我们说一个过程是递归的时候,是从语法的形式上说的。说明这个过程的定义中(直接或者间接的)引用了该过程本身。我们所说的线性递归和线性迭代说的是计算过程的进展方式。所以会有人说某一递归过程,产生出一个迭代的计算过程。

4.尾递归

从上面递归的迭代计算过程,我们使用递归的方式实现了循环。我们回想一下C语言和java等中的for循环,while循环,do…while循环。其实这些循环的内部定义使用的就是尾递归(在定义的尾部使用递归)。

1.2.2 树形递归

1.线性递归的设计优化

斐波那契额数定义:
如果n=0,f=0;如果n=1,f=1;否则 f=f(n-1)+f(n-2)
可以根据上面的算式定义直接写ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值