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类语言就是为了掌握编程的思维。

 

posted @   立体风  阅读(143)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示