Hatena::Groupsicp

a666666の日記 このページをアンテナに追加 RSSフィード

2010-01-10

P04 (*) Find the number of elements of a list.

| 23:40 | P04 (*) Find the number of elements of a list. - a666666の日記 を含むブックマーク はてなブックマーク - P04 (*) Find the number of elements of a list. - a666666の日記 P04 (*) Find the number of elements of a list. - a666666の日記 のブックマークコメント

リストの長さを求めよ、ってことかな。 length を自分で書けってことだと解釈してやってみる。 The Little Lisper に書いてあったので覚えてる。

(define (mylength l)
  (cond ((null? l) 0)
        (else (+ 1 (mylength (cdr l))))))
(mylength '(a b c))
;; => 3
(mylength '())
;; => 0

g000001g0000012010/01/11 01:07再帰の部分は完成してますね!
リストとリストを()を増やさないように合体させるには、appendが使えます('-'*)

a666666a6666662010/01/11 19:36アドバイスありがとうございます。
なるほど、 append を使えばいいのかぁ。どの組み込み関数を使っていいかを考えるのがちょっと悩ましいです。。

g000001g0000012010/01/11 20:03ちなみに、下請けの関数を定義する方法で、appendを使わない(定義しない)でも解ける方法が1つあります!

a666666a6666662010/01/12 01:17http://www.shido.info/lisp/scheme7.html にも似た問題があって、ちょうどその問題の直前で末尾再帰の解説があり下請けの関数を定義してたので、「myreverse とは別に、引数を二つとる別の関数を使うのかなぁ」と予想はできたのですが、いざ実装してみようとするとさっぱり手が動きませんでした。どうも、僕の頭は自分で思っていたよりずっとリスト操作が苦手なようです。

g000001g0000012010/01/12 03:12またまた再帰の部分は完成してますね!
consされるところを変えれば完成ではないでしょうか!
(myreverse '(1 2 3 4) ())
-> (myreverse '(2 3 4) (cons 1 '()))
-> (myreverse '(3 4) (cons 2 '(1)))
-> (myreverse '(4) (cons 3 '(2 1)))
-> (myreverse '() (cons 4 '(3 2 1)))
なんというか、左を減らして、右を増やす、みたいな…