2017年04月04日
計算機プログラムの構造と解釈 問題1.3
計算機プログラムの構造と解釈(SICP)の問題1.3の解答。
三つの数を引数としてとり、大きい二つの数の二乗の和を返す手続きを定義せよ.
SICPの11ページで登場する問題でここまでに出てきた手続きを使用して書くとこんなところでしょうか。
二乗を計算する手続きと、二乗の和を計算する手続きを定義して、condで場合分け。
多値が使えるなら3つのうち大きい2つを返す手続きを定義してこんな感じでしょうか。
3つの引数のうち大きい2つを返す手続きはもっと一般化できそうです。複数の引数を取って大きい2つを返すようにしてみました。
問題
三つの数を引数としてとり、大きい二つの数の二乗の和を返す手続きを定義せよ.
単純な実装
SICPの11ページで登場する問題でここまでに出てきた手続きを使用して書くとこんなところでしょうか。
二乗を計算する手続きと、二乗の和を計算する手続きを定義して、condで場合分け。
;;xを二乗する
(define (square x) (* x x))
;;xとyの二乗の和
(define (sum-of-squares x y)
(+ (square x) (square y)))
;;3つの引数のうち大きい2つの二乗の和
(define (sum-of-squares2 a b c)
(cond ((and (> a c) (> b c))
(sum-of-squares a b))
((and (> b a) (> c a))
(sum-of-squares b c))
(else
(sum-of-squares a c))))
多値とletが使えるなら
多値が使えるなら3つのうち大きい2つを返す手続きを定義してこんな感じでしょうか。
;;3つの引数のうち大きい2つを返す
(define (larger-two-nums a b c)
(cond ((and (> a c) (> b c))
(values a b))
((and (> b a) (> c a))
(values b c))
(else
(values a c))))
;;3つの引数のうち大きい2つの二乗の和
(define (sum-of-squares2-2 a b c)
(receive (x y)
(larger-two-nums a b c)
(sum-of-squares x y)))
3つの引数のうち大きい2つを返す手続きはもっと一般化できそうです。複数の引数を取って大きい2つを返すようにしてみました。
;;2つ以上の引数のうち大きい2つを返す
(define (larger-two-nums x y . args)
(let loop ((x x) (y y) (args args))
(cond ((null? args)
(values x y))
((> (car args) x)
(loop (car args) y (cdr args)))
((> (car args) y)
(loop x (car args) (cdr args)))
(else
(loop x y (cdr args))))))
新品価格 |
【このカテゴリーの最新記事】
-
no image
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6128663
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック