rurururururumin’s diary

勉強の備忘録

SICP 1.6

問題 1.6

Alyssa P. Hackerはifが特殊形式である理由が分らない. 「cond を利用し, 普通の手続きとして定義してはいけないの?」と聞いた. Alyssaの友人のEva Lu Atorはそうすることはもちろん出来るといって, ifの新版を定義した:

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
EvaはAlyssaにプログラムを見せた:
(new-if (= 2 3) 0 5)
5

(new-if (= 1 1) 0 5)
0
Alyssaは喜び, 平方根のプログラムを書き直すのにnew-ifを使った:
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
Alyssaが平方根を計算するのにこれを使おうとすると, 何が起きるか, 説明せよ.

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))

(new-if (= 2 3) 0 5)
(new-if (= 1 1)0 5)
#|①(new-if 述部 後節、ほかの節)と②を対応付けます。
②(predicateが真ならthen-clauseと返す。そのほかならelse-clauseと返す。 ⇒☆ここで、特殊形式じゃなくしている|#

(define (avarage x y)
(/ (+ x y) 2))
(define (square x)
(* x x))

(define (improve guess x)
(avarage guess (/ x guess)))
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))


;各定義類
(define (sqrt-iter guess x )
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))

(trace sqrt-iter)
(sqrt-iter 3 9)


#|③(sqrt-iter guess x)を以下と対応付けます。
  ①new-if(good-enough? guess x)が真ならguess、それ以外なら(sqrt-iter(guess x)x)と返す。
SICPは作用的順序を使っている、☆より、特殊形式ではないただの手続きなので
③と②の「それ以外」が再帰しぱなしになる|#

SICP 1.5

問題 1.5

Ben Bitdiddleは, 彼の対面している解釈系が, 作用的順序の評価を使っているか, 正規順序の評価を使っているか決定するテストを発明した. 次の二つの手続きを定義した:
(define (p) (p))

(define (test x y)
(if (= x 0)
0
y))
彼は次に式
(test 0 (p))
を評価してみた. 作用的順序の評価を使う解釈系で, Benはどういう振舞いを見るか. 正規順序の評価を使う解釈系で, 彼はどういう振舞いを見るか. 説明せよ. (特殊形式ifの評価規則は, 解釈系が正規順序と作用的順序のどちらを使うかに無関係に同じとする: 述語式を最初に評価し, その結果が帰結式と代替式のいずれを評価するかを決める.)

特殊形式と解釈系の働きを見る問題。

#lang racket
(define (p)(p)) ;①pとpを対応付ける

(define (test x y )
(if (= x 0)
0
y))
#|②もし(x=0)だったら0と返す、それ以外はyと返す。    |#

(test 0 (p))   ;③0とpのtest値は?⇒エラー

#|*ノート
①への扱い方が違う
正規順序…完全に展開してからの処理なので、すべて展開されたうえで、特殊形式であるifの働きから条件に合う0が返ってくるはず。


作用的順序…引数を評価してから展開、①が永遠に評価できないから答が返ってこない|#

LISP系は作用的順序を採用しているのでエラー、無限ループになる。

SICP 問題1.4

問題 1.4


われわれの評価モデルは, 演算子が合成式である組合せでも使えることを観察せよ. それに従って, 次の手続きの振舞いを述べよ.
(define (a-plus-abs-b a b)
( (if (> b 0) + -) a b) )

とりあえずぶっこも~

#lang racket
(define (a-plus-abs-b a b)
( (if (> b 0) + -) a b ) )       
#| ①(b>0なら+を返す。そうじゃなければ-を返す。)
という計算式を  (a-+-絶対値-b) として定義する。


(a-plus-abs-b -26 -85)

>59


#|a=-26,b=-85だったら
(if (> b 0) + -) a b ))
(( -85 なので、-を返す)ab)
つまり、( - a b)
-26 - (-85) =59 |#

(a-plus-abs-b)の塊に気取られたけど、ただの記号みたいなもんね。
見たかったことは、if文の中で演算子が組み合わせで使えるぞ、ということかな。日本語合ってるかな。

SICP 問題1.3

問題 1.3

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

やっとプログラミングっぽい問題。
condの練習かな?

(require (lib "racket/trace.ss"))
(define a 1)
(define b 7)
(define c 5)

(define sumofsquare ;「二乗の和」の定義
(cond ( (and (> a c)(> b c))(+ (* a a)(* b b)) )   
   ;aとbがcより大きいとき、a^2+b^2
( (and (> b a)(> c a))(+ (* b b)(* c c)) )
;bとcがaより大きいとき、b^2+c^2
( (and (> a b)(> c b))(+ (* a a)(* c c)))))
;aとcがbより大きいとき、a^2+c^2

sumofsquare

>74

でいけてる~と思ってたけど、これ手続きじゃなかった。
traceに怒られちゃった。

(define (sum-of-square x y)
(+ (* x x)(* y y)))
;二乗の和の定義
(define (hikisuu a b c)
(cond ( (and (> a c)(> b c))(sum-of-square a b))
;aとbがcより大きいとき、a^2+b^2
( (and (> b a)(> c a))(sum-of-square b c))
;bとcがaより大きいとき、b^2+c^2
    (else
(sum-of-square a c))))
;aとcがbより大きい とき、a^2+c^2


(trace hikisuu)
(hikisuu 1 7 5)


>(hikisuu 1 7 5)
<74

手続き名がダサいな、、
はてな記法でracketないから見にくい~~~
せめて色だけでも変えれたらな

8/22 色だけ変えてみた
引用にしたら位置がずれるずれる(;;`)

SICP 問題1.2

お盆毎日しようと思ってたのに…
逆にこれくらいマイペースな方がいいんかな…
 
    問題 1.2

次の式を前置記法に翻訳せよ. 
f:id:rurururururumin:20180820220816p:plainf:id:rurururururumin:20180820213202p:plain

 (/ (+ 5 4
   (- 2
     (- 3
             (+ 6
             (/ 4 5)))))
(* 3
       (- 6 2)
       (- 2 7)))

#|----------------------------------
普通に計算すると、
( 5 + 4 + ( 2 - ( 3 - 6.8)))/3*4*-5
= ( 5 + 4 + ( 2 - ( -3.8 )))  /  -60
=( 5 + 4 + 5.8 ) / -60
=(14.8 / -60)
=-(148/600) 4で約分 
---------------------------------|#

>     -37/150
#<procedure:>>                          

分数が計算できる~    

SICP問題1.1

ちゃんと続けられるかな~とか書いてて

しょっぱなから20日近くも経ってました。

このブログの未来が予想できすぎる()

 

気を取り直して、さっそくやっていきます。

前文とか、章の文章が噂通り難し~

「文章読む」という行為に抵抗ないし早く読めるタイプだしーと自負してたのに

流し読みすると「えっ、えっ、何書いてた??」ってなります。

 

f:id:rurururururumin:20180812002400p:plain

Drracketはこんな感じです。

これはただぶっこむだけ。

f:id:rurururururumin:20180812004510p:plain

 

特殊形式 define が出てきました。

また、racketではfasle は#fで出ます。

f:id:rurururururumin:20180812005146p:plain

条件分岐 、特殊形式のif と cond の問題。

ifは2条件の身に使えます。

また、ifの合成述語によく使われるのは

and式

or式

not式 

の3つですが、notだけ特殊形式ではありません。

 

とりあえずぶっこむだけの問題です。

人生初ブログなので何の知識もなく書いたけど、もっといいコードの載せ方あるはず、、、、

 

ってか、普通の章の説明とかは問題とは別々で書いた方がいいかな~

試行錯誤しながら書いていきます。

はじめに

はじめまして。

  •  プログラミング未経験
  • ド文系脳

が、苦しみもがきながらSICPをやります。

 

SICP-計算機プログラムの構造と解釈ー

https://sicp.iijlab.net/fulltext/

ここで日本語版の内容が見れます。

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

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

 

 

 ここでは自分の解答を備忘録としておいていきます。

コードはracketで記入します。

翻訳が難しいとのことなので、問題文から求められていることを見出す力も

培えれたらなと思います。

 

ちゃんと続けられるかな~