1. 程式人生 > 其它 >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類語言就是為了掌握程式設計的思維。