 
 
 
 
 
 
 
 
 
 
リストの要素はまたリストでよいという再帰的構造が存在しているので, リスト処理の関数は, 再帰を用いると気持よく書けることがおおい.
 以外の数字のとき 1,
 以外の数字のとき 1,
 のとき 0 を戻す.
よって次のプログラムでよい.
 のとき 0 を戻す.
よって次のプログラムでよい.
プログラム
def count_numbers(L) {
  if (length(L) == 0) return(0);
  C = car(L);
  if (type(C) == 0 || type(C) == 1) {
     return(1 + count_numbers(cdr(L)));
  }else if (type(C) == 4) {
     return(count_numbers(C)+count_numbers(cdr(L)));
  }else{
     return(count_numbers(cdr(L)));
  }
}
 [or, p,[and,[[not,p], q]]] 
なる形の式だとする. ここで、 p, q
は真(1)または偽(0)だとする. 
常に真である式を恒真式という. 
与えられた Well-formed formula が恒真式かどうか判定する関数を作れ. 
![\begin{displaymath}[1,2,[3,[4,5]],6,[7,8]] \rightarrow [1,2,3,4,5,6,7,8]\end{displaymath}](img422.png) 
list_append を使ってよい.)
ヒント:
 とし, その長さを
 とし, その長さを  とする.
 とする. 
 は
 は ![$L[0]$](img423.png) から
 から ![$L[N-1]$](img424.png) までの要素をもつ.
 までの要素をもつ. 
 を用意する. 最初は
 を用意する. 最初は ![$[]$](img426.png) にしておく.
 にしておく. 
 から
 から  に対して次の操作を行う.
 に対して次の操作を行う. 
 から
 から ![$L[I]$](img429.png) を抜いたリストを
 を抜いたリストを  とする.
 とする.
(例 ![$L=[1,2,3,4]$](img431.png) から
 から ![$L[1]$](img432.png) を抜くと
 を抜くと ![$LI=[1,3,4]$](img433.png) )
)
 は長さ
 は長さ  のリストで, これを引数として自分を呼び出し,
 のリストで, これを引数として自分を呼び出し, 
 から生成される順列全てのリスト
 から生成される順列全てのリスト  を作る.
 を作る.  の要素はまたリスト.
 の要素はまたリスト. 
(上の場合, 
![$RI=[[1,3,4],[1,4,3],[3,1,4],[3,4,1],
[4,1,3],[4,3,1]]$](img435.png) .)
.)
 の各要素の先頭に
 の各要素の先頭に ![$L[I]$](img429.png) を付け加える.
 を付け加える.
(上の場合, 
![$[[2,1,3,4],[2,1,4,3],[2,3,1,4],[2,3,4,1], [2,4,1,3],[2,4,3,1]]$](img436.png) となる.)
となる.)
 に追加する.
 に追加する. 
ここでの方法ではリストの  番目を抜く関数が必要となる. 
これは, 例えば
重なった
 番目を抜く関数が必要となる. 
これは, 例えば
重なった  枚の紙があったとして, その上から
 枚の紙があったとして, その上から  番目の紙を抜き出す
場合を考えればなにをすればよいか分かると思う. くどいのを承知で説明
すると
 番目の紙を抜き出す
場合を考えればなにをすればよいか分かると思う. くどいのを承知で説明
すると
 回行う
 回行う
いずれにしても, 再帰で書くことになるが, 注意すべき点は, 再帰の終点
をどこにするかである.  の長さが 1 の場合に終点とすれば分かりやすい. 
この場合
 の長さが 1 の場合に終点とすれば分かりやすい. 
この場合 ![$L=[a]$](img437.png) なら
 なら ![$[[a]]$](img438.png) を返すようにすればよい. (結果は
順列 (リスト) のリストとなることに注意.)
 を返すようにすればよい. (結果は
順列 (リスト) のリストとなることに注意.) ![$L=[\ ]$](img439.png) を終点とすること
もできるが, この場合
 を終点とすること
もできるが, この場合 ![$[[\ ]]$](img440.png) (空リストを要素とするリスト) を返す
必要がある. こうしないと, 再帰が進まない.
 (空リストを要素とするリスト) を返す
必要がある. こうしないと, 再帰が進まない. 
 
 
 
 
 
 
 
 
