2015年1月18日日曜日

開発環境

コンピュータプログラミングの概念・技法・モデル(IT Architect' Archiveクラシックモダン・コンピューティング6) (IT Architects’Archive CLASSIC MODER)(セイフ・ハリディ (著)、ピーター・ヴァン・ロイ (著)、Peter Van-Roy (著)、 Seif Haridi (著)、羽永 洋 (翻訳) 、翔泳社、原書: Concepts, Techniques, and Models of Computer Programming(CTM))の第部(一般的計算モデル)、第2章(宣言的計算モデル)、2.9(練習問題)、9-a.(末尾再帰)を解いてみる。

9-a.(末尾再帰)

コード(Emacs)

% 関数を核言語の手続きに翻訳。
local Sum1 in
   proc {Sum1 N ?R}
      R= if N==0 then R=0
         else
            local Rr in
               {Sum1 N-1 Rr}
               N+Rr
            end
         end
   end
end

local Sum1 in
   proc {Sum1 N ?R}
      if N==0 then R=0
      else
         local Rr in
            {Sum1 N-1 Rr}
            R=N+Rr
         end
      end
   end
end

local Sum1 in
   Sum1= proc {$ N ?R}
            if N==0 then R=0
            else
               local Rr in
                  {Sum1 N-1 Rr}
                  R=N+Rr
               end
            end
         end
end
           
local Sum2 in
   proc {Sum2 N S R}
      R= if N==0 then S
         else
            {Sum2 N-1 N+S R}
            R
         end
   end
end

local Sum2 in
   proc {Sum2 N S R}
      if N==0 then R=S
      else         
         {Sum2 N-1 N+S R}
      end
   end
end

local Sum2 in
   Sum2= proc {$ N S R}
            if N==0 then R=S
            else
               {Sum2 N-1 N+S R}
            end
         end
end

% Sum1は、その中にただ1つの再帰呼び出しがあるが、その手続き本体の最後はその手続きの呼び出しではないので、末尾再帰ではない。
% Sum2は、その中にただ1つの再帰呼び出しがあり、かつその手続き本体の最後はその手続きの呼び出しなので、末尾再帰である。

0 コメント:

コメントを投稿