其他分享
首页 > 其他分享> > scheme代码返回3个数中较大2个数之和

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