アフィリエイト広告を利用しています

広告

posted by fanblog

2017年04月04日

計算機プログラムの構造と解釈 問題1.3

計算機プログラムの構造と解釈(SICP)の問題1.3の解答。


問題


三つの数を引数としてとり、大きい二つの数の二乗の和を返す手続きを定義せよ.


単純な実装


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))))))



計算機プログラムの構造と解釈 第2版

新品価格
¥4,968から
(2017/4/4 18:13時点)



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6128663
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
検索
最新記事
最新コメント
カテゴリーアーカイブ
タグクラウド
<< 2018年05月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
プロフィール
さんの画像

情報系を専攻する学生。 しばらく使わなかったりした知識は忘れていくのでこのブログにまとめてみたり。
プロフィール
×

この広告は30日以上新しい記事の更新がないブログに表示されております。