版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014680513/article/details/50997036
0x00 序
最近在看廖雪峰老师python2.7的教程,看到lambda的时候卡了半天,不知道该怎么理解这个表达式,而且在用C#做毕设的时候,学长分享的代码中也出现了这个表达式,于是去知乎上看看有没有大牛给出一些简单好理解的解释。然后就发现了有人推荐阅读SCIP这本书,以便对高阶函数有更深刻的理解。我看书不习惯跳到某一章看,所以还是从头来过,顺便做做习题。因为原书使用的是Lisp的分支scheme语言,所以编译器我们就选大家都推荐的DrRacket。
0x01 1.1节
我是小白,有什么不对或者更简洁的方法请不吝赐教。
练习1.2:
/ (+ (5 (+ 4(- 2(- 3(+ 6(/ 4 5)))))))(* 3(* (- 6 2)(- 2 7)))
练习1.3:
(define (max a b )
(if (> a b)
( a )
b))
(define (max3 a b c)
(cond ((> c (max a b)) c )
(else (max a b))
(define (sum_max2 a b c)
(cond
((= a (max3 a b c)) (+ a (max b c)))
((= b (max3 a b c)) (+ b (max a c)))
((= c (max3 a b c)) (+ c (max a b)))))
练习1.4:
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))
关于这段的理解就是当b>0时,(if (> b 0) + -)就等于+号,所以((if (> b 0) + -) a b))就等同于(+ a b);反之,等同于(- a b)。所以这个函数的作用等同于a + | b |。Lisp允许运算符为复合表达式的组合式都归功于Lisp的运算符的前缀表示。
练习1.5:
(define (p) (p))
(define (test x y)
(if(= x 0)
0
y))
“完全展开而后归约”的求值模型称为正则序求值
“先求值参数而后应用”的方式称为应用序求值
我的理解就是,对于正则序如果没用到某个形参的时候是不会对形参求值的,而相反应用序则会先对形参求值,再做进一步运算。
所以在这个程序中,如果答案显示 0 ,则说明解释器采用的是正则序。如果一直死循环陷入停滞,则解释器采用的是应用序。
△练习1.6:
这题我看半天都不知道问题出在什么地方,然后去百度了一下答案,然后又回去翻if和cond的定义,还是不大理解为什么不对。
(if <predicate> <consequent> <alternative>)
在求值一个if表达式时,解释器从求值其<predicate>部分开始,如果<predicate>得到真值,解释器就去求值<consequent>并返回其值,否则它就去求值<alternative>并返回其值。
(cond (<p1> <e1>)
(<p2> <e2>)
.
.
(<pn> <en>))
先包含一个符号cond,之后跟着子句表达式对偶(<p> <e>)。在每个对偶中的第一个表达式是谓词,它的值被解释为真或假。先求谓词<p1>,如果为false,那么就去求值<p2>,如果<p2>为false则求<p3>。直到发现某个谓词值为真。此时解释器返回相应子句中的序列表达式<e>的值。
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
谁能告诉我,换成new-if后的,predicate then-clause else-clause分别在新的代码里表示哪些部分啊TAT
练习1.8:
(define (cube x)
(* x x x))
(define (cube-root x)
(cube-root-iter 1.0 x))
(define (cube-root-iter guess x)
(if (good-enough? guess x)
guess
(cube-root-iter (improve guess x)
x)))
(define (good-enough? guess x)
(< (abs (- (cube guess) x))
0.001))
(define (improve guess x)
(/ (+ (/ x (square guess)) (* 2 guess))
3))