零基础SICP:第3课
|
|
编程的基本原理
|
Elements of Programming
|
表达式 |
Expressions |
命名与环境 |
Naming and the Evironment |
组合式的求值 |
Evaluating Combinations |
复合函数 |
Compound Procedures |
函数应用的代换模型 |
The Subsitution Model for Procedure Application |
条件表达式和谓词 |
Conditional Expressions and Predicates |
|
|
线性递归和迭代 |
Linear Recursion and Iteration |
树形递归 |
Tree Recursion |
条件表达式和谓词—短路运算
|
|
应用序求值(Scheme使用的是应用序求值)
正则序求值
abs1
abs2
abs3
1
1
Scheme]
(define (abs1 x)
(cond ((> x 0) x)
((= x 0) 0)
(else (- x))))
Scheme]
(define (abs2 x)
(if (> x 0)
x
(- x)))
Scheme]
(define (abs3 x)
(or (and (> x) x) (- x)))
Scheme]
(abs1 1)
Scheme]
(abs1 -1)
Scheme]
问题
练习
循环:求和
|
|
result := 0
for i ← 1 to n do
result := result + i
end for
Scheme]
(define result 0)
Scheme]
(for (x (list 1 2 3 4))
(set! result (+ result x)))
Scheme]
result
Scheme]
>>>
def sum_n(n):
result= 0
for i in range(n):
result= result + (i + 1)
return result
>>>
sum_n(3)
>>>
list(range(3))
>>>
练习
线性递归:求和
|
|
Scheme] |
(define (sum start end) (cond ((> start end) 0) ((= start end) end) (else (+ start (sum (+ start 1) end))))) |
sum
Scheme] |
(sum 2 3) |
5
Scheme] |
树形递归:斐波那契数列
|
|
Scheme] |
(define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2)))))) |
Scheme] |
(fib 2) |
Scheme] |
树形递归→迭代
|
|
算法
算法
a ← 0
b 1
for i ← 1 to n do
old_b ← b
b ← a + b
a ← old_b
end for
Result: b
分治法:找零问题
|
|
无限多一元纸币
无限多五元纸币
无限多十元纸币
无限多五十元纸币
问题
¥6=6×¥1, ¥6=1×¥5+1
问题
问题
总结
|
|
回顾应用序求值和正则序求值
深入理解if和cond
编程中最基础的概念之一:循环
使用递归实现循环,基于循环理解递归
实战:线性递归和树形递归
技巧:将递归实现改为迭代实现
抽象:利用递归解决现实中的找零问题