\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とか、

DelphiVisual 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 (問710}

 既に手がけた式の計算に関するものを利用し、その後繰り上がりの処理を

します。

\item %{\bf (問711}

 もちろん前問を利用。

\item %{\bf (問712}\\[-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 (問713}\\[-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 (問714}\\[-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 [問715}

 これはかなり難しいと思います。%\\

手作業で樹形図をかくことを考えてみてください。まず、

要素を縦にならべて、それぞれについて枝をつけていきますね。

{\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}

%

 

※以降の問に関しては略します。