\chapter{解答例あるいはヒント}
\noindent
\begin{Answer}%1
\item (\pageref{toi01}ページ)\\
{\small
\begin{verbatim}
to Sankaku
repeat 3 [
forward 100
right 120
]
end
\end{verbatim}(以下略)
}% ----end of \small
%\item (\pageref{toi02}ページ)
%{\bf (問2)}
% 略。
%\item (\pageref{toi03}ページ)
%{\bf (問3)}
% 略。
%\item (\pageref{toi04}ページ)
%{\bf (問4)}
% 略。
\end{Answer}
\begin{Answer}%2
\item (\pageref{toi05}ページ)
%{\bf (問5−1)}
\footnote{これを実行しても何の変化がないように見えますが例えば\verb+ print :A5 + などを
実行して見てください。}%\\[-2zh]
{\small
\begin{verbatim}
to Kisuu
make "i 1
repeat 9
[ make ( word "A :i ) 2 * :i -
1
make "i :i + 1
]
end
\end{verbatim}
}%------end of \small
\item (\pageref{training}ページ)\\
{\small
\begin{verbatim}
to Touhi :n
if :n > 1 [ output 2 * Touhi ( :n - 1 ) ]
if :n = 1 [ output 3 ]
if :n < 1 [ print ( sentence "illegal!!
"Touhi :n "is "called )
stop
]
end
\end{verbatim}
}% end of \small
\item %{\bf 2.}\\[-2zh]
{\small
\begin{verbatim}
to Fib :n
if :n < 0 [ print ( sentence "illegal!!
"Fib :n "is "called )
stop
]
if :n < 2 [ output :n ]
output ( Fib ( :n - 1 )) + ( Fib ( :n - 2 ))
end
\end{verbatim}
}%-----end of \small
\item %{\bf 3.}\\[-2zh]
{\small
\begin{verbatim}
to Max :L
if ( count :L )
< 2 [ output first :L ]
if ( first :L ) > ( Max butfirst :L ) [ output first :L ]
output Max butfirst :L
end
\end{verbatim}
}% end of \small
\item %{\bf 4.}\\[-2zh]
{\small
\begin{verbatim}
to Sum_ :L
if empty? :L [ output 0 ]
print (list ( first :L ) "と ( butfirst :L ) )
output ( first :L ) + ( Sum_ butfirst :L )
end
\end{verbatim}
}% end of \small
\item %{\bf 5.}\\[-2zh]
{\small
\begin{verbatim}
to Item_ :n :d
if :n = 1 [ output first :d ]
output Item_ ( :n - 1 ) butfirst :d
end
\end{verbatim}
}% end of \small
\item %{bf 6.}\\[-2zh]
{\small
\begin{verbatim}
to Sentence_ :m :n
if empty? :n [ output :m ]
output Sentence_ ( lput first :n :m ) ( butfirst :n )
end
\end{verbatim}
}%end of \small
\item %{\bf 7.}\\[-2zh]
{\small
\begin{verbatim}
to Member?_ :m :n
if empty? :n [ output 0 = 1 ]
if :m = first :n [ output 1 = 1 ]
output Member?_ :m ( butfirst :n )
end
\end{verbatim}
}%end of \small
\item %{\bf 8.}\\[-2zh]
{\small
\begin{verbatim}
to Left$ :word :n
if :n = 1 [ output first :word ]
output ( word ( first :word )
(
Left$ ( butfirst :word ) ( :n - 1 ) ) )
end
to Right$ :word :n
if :n = 1 [ output last :word ]
output ( word ( Right$ ( butlast :word )
( :n - 1 ) ) ( last :word ) )
end
\end{verbatim}
}% end of \small
\item %{\bf 9.}\\[-2zh]
{\small
\begin{verbatim}
to Mid$ :L :m :n
if :m = 1 [ output Left$ :L :n ]
output Mid$ ( butfirst :L ) ( :m - 1 ) :n
end
\end{verbatim}
}%end of \small
\item %{\bf 10.}\\[-2zh]
{\small
\begin{verbatim}
to String$ :n :k
if ( count :n ) = :k [ output :n ]
if ( count :n ) > :k [ output word "**** :n ]
output String$ ( word "| | :n ) :k
end
\end{verbatim}
}%end of small
\item %{\bf 11.}\\[-2zh]
{\small
\begin{verbatim}
to V_Sum :m :n
if not ((count :m) = (count :n))
[ print [サイズ大丈夫?] stop]
if empty? :m [ output [] ]
output fput ((first :m)+(first :n))
V_Sum (butfirst :m) (butfirst
:n)
end
\end{verbatim}
}%end of \small
\item %{\bf 12.}\\[-2zh]
{\small
\begin{verbatim}
to Inner_Prod :m :n
if not ((count :m) = (count :n))
[ print [サイズ大丈夫?]
stop
]
if empty?
:m [ output 0 ]
output (
( first :m ) * ( first :n))
+ Inner_Prod (butfirst
:m) (butfirst :n)
end
\end{verbatim}
}% end of \small
\item %{\bf 13.}\\[-2zh]
{\small
\begin{verbatim}
to FibL :n
local [a b l]
if :n = 1 [output [0] ]
if :n = 2 [output [0 1] ]
if :n < 1 [print [そんなことしたらあきまへん]]
make "l ( FibL ( :n - 1 ) )
make "a last :l
make "b last butlast :l
output lput ( :a + :b ) :l
end
\end{verbatim}
}% end of \small
\item %{\bf 14.}\\[-2zh]
{\small
\begin{verbatim}
to PrimeL :n
if :n = 1 [ output [2] ]
if :n = 2 [ output [2 3] ]
if :n > 2 [ output Add_the_last
( PrimeL ( :n - 1 )) ]
end
to Add_the_last :L
output ( lput ( Next_Prime
( ( last :L )
+ 2 ) :L ) :L )
end
to Next_Prime :Candidate :L
if (Test_with_Each_Factor
:Candidate :L)[ output :Candidate ]
output Next_Prime (:Candidate + 2)
:L
end
to Test_with_Each_Factor :Candidate
:L1
if ( empty? :L1 ) [
output 1 = 1 ]
if ( remainder
:Candidate (first :L1) )
= 0 [ output 0 = 1 ]
output Test_with_Each_Factor
:Candidate ( butfirst :L1 )
end
;
end of PrimeL ----------------
\end{verbatim}
}%end of \small
\item %{\bf 15.}\\[-2zh]
{\small
\begin{verbatim}
to Factori :n
type (word "n "= )
wareru 2 :n
end
to wareru :f :n
if (:n < 2 ) [ print " stop ]
if (:n < 4 ) [ print (word "* :n) stop ]
if ( remainder :n :f ) = 0 [
type ( sentence
"* :f )
wareru :f (:n / :f
)
stop
]
if :f > 2 [ wareru ( :f + 2 ) :n stop ]
wareru 3 :n
end
; end of Factori--------
\end{verbatim}
}%end of \small
\item %{\bf 16.}\\[-2zh]
{\small
\begin{verbatim}
to P_Sentence :L
if ( empty? :L ) [ output [] ]
if ( word? first :L )
[ output fput ( first :L
)
( P_Sentence (
butfirst :L ) ) ]
output fput ( P_Sentence first :L )
( P_Sentence (
butfirst :L ) )
end
\end{verbatim}
}% end of \small
\item (\pageref{toi06}ページ)%{\bf (問6)}
\verb+GCM( 12, GCM( 16,18 ) ) = GCM( 12, 2 ) = 2+
\item 略。
\item (\pageref{toi07}ページ)%{\bf (問7−1)}\\[-2zh]
{\small
\begin{verbatim}
to
Bunbo :x
if word? :x [ output 1 ]
output last :x
end
\end{verbatim}
}% end of \small
\item %{\bf (問7−2)}\\[-2zh]
{\small
\begin{verbatim}
to Plus :x :y
output Stn Wa ( Bunsi :x ) ( Bunbo :x )
( Bunsi :y )
( Bunbo :y )
end
to Wa :a :b :c :d
output ( list ( :a * :d + :b * :c ) "/ ( :b
* :d ) )
end
;------ end of Plus 積はこれを参考に御自分で。
\end{verbatim}
}%end of \small
\item %{\bf (問7−3)}\\[-2zh]
{\small
\begin{verbatim}
to Hikizan :x :y
output Plus :x ( Times ( -1 ) :y )
end
to Warizan :x :y
output :x ( Inv :y )
end
to Inv :x
output
Stn ( list Bunbo :x "/ Bunsi :x )
end
\end{verbatim}
}%end of \small
\item %{\bf (問7−4)}\\[-2zh]
{\small
\begin{verbatim}
to Eva :x
if ( count :x ) = 1 [ make "x first :x ]
if ( word? :x ) [ output :x ]
if ( item 2 :x ) = "/
[ if word? first :x
[ if word? last :x
[ output Stn
:x ]
]
]
print ( list :x "これは繁分数 )
output ( Times ( Eva first :x )
( Inv Eva ButSec :x ) )
if ( item 2 :x ) = "*
[ output Times Eva first :x Eva ButSec :x ]
if ( item 2 :x ) = "+
[ output Plus Eva first :x Eva ButSec :x ]
if ( item 2 :x ) = "-
[ output Eva first :x
Times "-1 Eva ButSec :x ]
print ( list :x "ちょっとこれへんやで ) stop
end
to ButSec :x
output butfirst butfirst :x
end
------------------
\end{verbatim}
}%end of \small
%---------------------1998.5.13.--------------
\item %{\bf (問7−5)}\\%[-2zh]
{\baselineskip=1.98zh よくありがちなコメントに、Logoは慣れていないから使いにくいってのがありますが
比較するときには両者の他の要素が同じであるとして考察するべきですね。
確かに、すでに1年以上他の言語を使った経験のある人は慣れるのに数ヶ月かかるかも
しれません。
ところで、私はLogoが万能であるとは思ってはいません。Logoの処理系自体はLispとか、
Delphi(Visual Pascalとでも言うべきオブジェクト指向Pascal)で書かれていたり
するのですから、万能性は他の言語に譲るべきでしょう。
ビジネスの世界は American
English 、学問はドイツ語、愛をささやくならフランス語
???。これが当たっているかどうかはわかりませんが、その言語を使うことによって
あらわせる、あるいは、あらわしやすくなる物事ってのがあるはずです。
また、数式処理をするなら、Mathematica
などのソフトを使った方が楽です。
でも、昔趣味でラジオを自作した人がいたように、数式処理の機能を自作して
みることに Logo を大いに利用できると思えます。
}\\
\item %{\bf (問7−6)}\\[-2zh]
{\small
\begin{verbatim}
gettools などで、有理数の Plus,Times を定義済みであるとして、
to Plus_E :m :n
if ( count :m ) < ( count :n )
[ output Plus_E :n :m ]
if ( count :n ) = 0 [ output :m ]
output lput ( Plus last :m last :n )
( Plus_E butlast :m butlast :n )
end
to Times_E :m :n
if ( count :n ) = 0 [ output :n ]
if ( count :m ) = 0 [ putput :m ]
if ( count :n ) = 1
[ output lput ( Times last :m :n )
( Times_E ( butlast :m ) :n )
]
output Plus_E ( Times_E :m last :n )
( Times_E lput 0 :m butlast :n )
end
\end{verbatim}
}%\small
\item %{\bf (問7−7)}\\[-2zh]
{\small
\begin{verbatim}
to Horner :f :a
output HornerJ butfirst :f lput first :f []
end
to HornerJ :a :b
if empty? :a [ output :b ]
HornerJ ( butfirst :a ) ( lput
( plus first :a
Times :x last :b ) :b )
end
\end{verbatim}
}%end of \small
\item %{\bf (問7−8)}\\[-2zh]
{\small
\begin{verbatim}
to QuEq :e
local [ a b c p q r s ]
make "a first :e
make "b item 2 :e
make "c item 3 :e
make "p Times "-1 :b
make "q 1
make "r :b * :b - 4 * :a * :c
make "s Times "-2 :a
c [*/ p ± q √r
x = ---------------
s
/*]
RootDasi
c [*/ 平方根の中の平方数を根号の外へ出す/*]
Yakb c [*/ p,q,s の約分 /* ]
Hyouji c [*/ 複素数解の場合、
q = 0, r = 0,1 , s = 1
の場合なども考慮して解
を表示する /*]
end (未完)
\end{verbatim}
}%end of \small
\item %{\bf (問7−9)}\\[-2zh]
{\small
\begin{verbatim}
to Solve :f
print ( list :f "について解きます。 )
if ( Eva first :f ) = 0
[ Solve butfirst :f stop ]
if ( count :f ) = 2
[ ItijiEq :f ] c [/*一次方程式*/]
if ( Try Candid Bun_Harai :f ) = [End]
[ if ( count :f ) = 3
[
QuEq :f stop
]
print [ ** これ以上解けません ** ]
]
end
to Try :Cand
c [ /* 解の候補を並べたリスト :Cand の要素を片端から
解かどうか確かめて、解なら解ですと表示する。
また、引数が空となったら[End]を出力する。 */]
end
to Candid :f
c [ /* ±( last :f の約数 )/( first :f
の約数)
の形の数をすべて並べたリストを出力する。 */ ]
end
to Bun_Harai :f
c [ /* 有理数係数を持つ方程式 :f に対して、
その分母を払った整数係数をもつ方程式
を出力する。
*/]
end
\end{verbatim}
}%end of \small
\item %{\bf (問7−10)}
既に手がけた式の計算に関するものを利用し、その後繰り上がりの処理を
します。
\item %{\bf (問7−11)}
もちろん前問を利用。
\item %{\bf (問7−12)}\\[-2zh]
{\small
\begin{verbatim}
to Kaisa :Kansuu :n
output ( Tuginokou :Kansuu :n - run :Kansuu )
end
to Delta :k :Kansuu :n
if :k = 0 [ output run :Kansuu ]
if :k = 1 [ output Kaisa :Kansuu :n ]
output ( Delta ( :k - 1 ) :Kansuu ( :n + 1 )
- Delta ( :k - 1 )
:Kansuu :n
)
end ;第k階の階差もこのようにかけます。
to Sigma :Kansuu :k
local "n
make "n :k
if :k = 1 [ output run :Kansuu ]
output ( run :Kansuu ) + ( Sigma :Kansuu :k - 1 )
end
\end{verbatim}
}%end of \small
\item %{\bf (問7−13)}\\[-2zh]
{\small
\begin{verbatim}
to Repeat_ :n :L
if :n = 0 [ stop ]
run :L
Repeat_ :n - 1 :L
end
\end{verbatim}
}%end of \small
\item %{\bf (問7−14)}\\[-2zh]
{\small
\begin{verbatim}
to Involve :a :b
if empty? :b [ output 1 = 1 ]
if ( not member? ( first :b ) :a )
[ output 0 = 1 ]
output Involve :a ( butfirst :b )
end
to Equal_Set :a :b
output ( and ( Involve :a :b )
( Involve :b :a ) )
end
\end{verbatim}
}%end of \small
\item %{\bf [問7−15]}
これはかなり難しいと思います。%\\
手作業で樹形図をかくことを考えてみてください。まず、
要素を縦にならべて、それぞれについて枝をつけていきますね。
{\small
\begin{verbatim}
to Junretu :List :k
local [ f bf ]
if :k = 0 [ output [] ]
if :k = 1 [ output Parsed :List ]
if empty? :List [ output [] ]
output SelectFirst [] :List :List
end
to SelectFirst :T :L :Nokori
local [ f bf bm Sippo]
make "f first :L
make "bf butfirst :Nokori
make "bm ButMem :f :L
make "Sippo Junretu :bm ( :k - 1 )
if empty? :Nokori [ output :T ]
output ( SelectFirst
( sentence :T ( PutAsFirst :f :Sippo
) )
:L :bf )
end
to PutAsFirst :f :S
if empty? :S
[ output [] ]
output sentence ( fput :f first :S )
PutAsFirst :f butfirst :S
end
to Parsed :L
output fput parse first :L
Parsed butfirst :L
end
to ButMem :Item :List
if first :List = :Item
[ output butfirst :List ]
output fput first :List
ButMem :Item ( butfirst :List
)
end
\end{verbatim}
}%end of \small
\end{Answer}
\begin{Answer}%3
\item (\pageref{toi08}ページ)
%{\bf (問8−1)}
引数に関して何もしない
\verb+ C + という関数を定義しています。\\
\item %{\bf (問8−2)}
はじめの8色に関しては、3原色の加色法の2進数表示でいたが、
16色に追加されたので、あとの8色はもとのものに彩度を減じたものとなっているようです。Logo Writer と Pc Logo では決めかたが同じではないようです。\\
\item %{\bf (問8−3)} \\[-2zh]
{\small
\begin{verbatim}
to setc :n
setpc :n
end
\end{verbatim}
}%end of \small
\item %{\bf (問8−4)}\\[-2zh]
{\small
\begin{verbatim}
to Set_Head :Vx :Vy
make "W who
tell 3
setpos [ 0 0 ]
make "h towards ( list :Vx :Vy )
tell :W
seth :h
end
\end{verbatim}
}%end of \small
\item 略
\item 13
%\item (以下の問に関して)略
\end{Answer}
%
※以降の問に関しては略します。