再帰(関数の再帰呼出)について

再帰の枠組

有効な再帰の条件

  1. 末端があること(末端では再帰しない)。

  2. 呼び出し1レベル毎に末端に向けての変化があること。

  3. 変化の経路がループになっていないこと。

    (ループの可能性のある経路はチェックして踏み入れない)

    (関数呼出のときに戻るべきアドレスや呼出元の 途中経過がスタックに「積まれ」、それがスタックとして 用意されたメモリ領域からあふれることによるエラー)

再帰の例
  1. 階乗の計算 (英語で factorial)

    数学で用いられる帰納的定義(概ね右図のような)に沿って書くとこうなる: 階乗の帰納的定義

    def fact(n)
       if n <= 1 then 1
         else n*fact(n-1)
       end
    end
    演繹的定義
  1. アッカーマン関数 (再帰の例として有名):

  2. 他に フィボナッチ数列 たらいまわし関数(竹内関数とも呼ばれる)も有名

  3. 前回課題の、整数を文字列に変換するコードの例も提示しておこう。

    n2sの構造 n2sの例

    def n2s(n,r="")   # nは0以上の整数 を前提としておく
        if n<=0
            then (r==""?'0':r)
            else n2s(n/10,'0123456789'[n%10]+r)
        end
    end

    おまけ

    (m <- 2..16 についてのm進数に拡張;基数mを第二引数で渡す)

    def n2s(n,rdx=10,r="")   # assume rdx(raddix) <=16
         if n<=0
             then (r==""?'0':r)
             else n2s(n/rdx,rdx,'0123456789abcdef'[n%rdx]+r)
         end
     end