scheme代码返回3个数中较大2个数之和
作者:互联网
这是SICP的一道练习题(题号1.3)
定义一个过程,它以三个数为参数,返回其中较大的两个数之和。
首先,联想决策树模型:
x < y / \ / \ / \ x < z y < z / \ / \ / \ / \ x < y x < y y < x y < x x < z z < x y < z z < y
第一种方法:用 if 语句大概这么理解
(if (> x y) ; x 较大 (if (> y z) ; x 和 y 较大 ; x 和 z 较大) ; y 较大 (if (> x z) ; y 和 x 较大 ; y 和 z 较大))
具体代码:
(define (b1 x y z) (if (> x y) (if (> y z) (+ x y) (+ x z)) (if (> z x) (+ y z) (+ y x))))
第二种方法: 用 cond 语句
(cond ((and (> x y) (> y z)) ; x 和 y 较大) ((and (> x y) (> z y)) ; x 和 z 较大) ((and (> y x) (> x z)) ; y 和 x 较大) ((and (> y x) (> z x)) ; y 和 z 较大))
具体代码:
(define (b3 x y z) (cond ((and (> x y) (> y z)) (+ x y)) ((and (> x y) (> z y)) (+ x z)) ((and (> y z) (> z x)) (+ y z))))
第三种方法,也是需要熟悉的,用两个更小的函数bigger 和 smaller,来对两个参数求出较大和较小的。
具体思路:两个中较大的肯定算一个数,两个中较小的数和另外一个数比较出较大的来,这两个数就是题目要的。
具体代码:
(define (b3 x y z) (+ (bigger x y) (bigger (smaller x y) z)))
总结:这个题并不难,之所以写出来,是因为第一,第二中方法的逐步分类并排除的思路,是很重要很基础的。第三种再次拆分为更小的函数去解决问题的思维也是重要的。
本来学习Lisp类语言就是为了掌握编程的思维。
标签:两个,个数,代码,较大,cond,scheme,bigger,define 来源: https://www.cnblogs.com/litifeng/p/16261850.html