应用序和正则序

应用序和正则序主要是解释顺序上面的区别.

应用序首先对参数求值后再代换,

而正则序在代换完全后再归约求值.

 

应用序和正则序测试

1 ;; Scheme code
2 (define (p) (p))
3
4 (define (test x y)
5 (if (= x 0)
6 0
7 y))
8
9 (test 0 (p))

应用序首先对(p)不断求值,陷入无限循环,

正则序首先完全展开表达式,后求值为0.


为什么if是特殊表达式

if语法是这个样子的

  (if predicate then-clause else-clause)

当predicate为真的时候只对then-clause求值,而忽略else-clause.

一般的应用序表达式首先对参数求值后再求值整个语句,下面的例子说明了这个顺序差异的重要性.

 

牛顿法求平方根 

 1 ;; Scheme code
2 (define (good-enough? guess x)
3 (if (< (abs (- (* guess guess) x)) 0.000000001)
4 true
5 false))
6
7 (define (improve guess x)
8 (/ (+ guess (/ x guess)) 2))
9
10 (define (sqrt-iter1 guess x)
11 (if (good-enough? guess x)
12 guess
13 (sqrt-iter1 (improve guess x) x)))
14
15 (define (my-if predicate then-clause else-clause)
16 (if predicate then-clause else-clause))
17
18 (define (sqrt-iter2 guess x)
19 (my-if (good-enough? guess x)
20 guess
21 (sqrt-iter2 (improve guess x) x)))
22
23 (define (my-sqrt1 x)
24 (sqrt-iter1 2.0 x))
25
26 (define (my-sqrt2 x)
27 (sqrt-iter2 2.0 x))
my-sqrt1可以求出正确的平方根,
而my-sqrt2因为首先对参数进行求值,而陷入无限的递归循环中去.
if表达式会首先对predicate求值,根据结果确定要求值的表达式,与一般的表达式参数求值顺序不一致,比较特殊.

转载于:https://www.cnblogs.com/maxima/archive/2011/11/15/2249575.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值