scheme程式碼返回3個數中較大2個數之和
阿新 • • 發佈:2022-05-12
這是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類語言就是為了掌握程式設計的思維。