2012-04-30 12 views
1

私は入力のペアの数を数える必要がある割り当てがあります。Schemeのペアの数をカウントする

これは私がこれまで持っているものです。

(define x 0) 

(define number-of-pairs 
    (lambda (v) 
    (if (pair? v) 
     (+ x 1) 
     (+ x 0)))) 

そして、次のように私はそれを使用します。それは2を生成する必要があり

ここ
(number-of-pairs (cons (cons 'a 'b) 'c)) 

が、それだけで行くようにではなく、1を生成一度その機能を通して。私は

(number-of-pairs 10) 

をしようとした場合、それは何のペアが存在しないはずなのでとして それは、0を生成します。

+0

':

(define (number-of-pairs v) (if (not (pair? v)) <???> (+ <???> (number-of-pairs <???>) (number-of-pairs <???>)))) 

はあなたの手順をテストするためにこれらの例を使用しますペア? 'を引数にとります。 –

+0

どのようにして各ペアのループにすることができますか? – LinkToThePast

+1

再帰を使用する... –

答えて

5

次の2つのケースを検討する必要があります:現在の要素ペアでない場合

  1. はどうなりますか?
  2. 現在の要素のペアの場合はどうなりますか?

2番目のケースでは、現在の要素がペアであることがわかっているため、合計に1を追加してから、ペアの両方の部分で再帰を呼び出します。どちらか一方が順番にペアになります。

がここで何をすべきかの一般的な考えだ、フィルインの空白:このコードは、コールが、基本的に何もしません

(number-of-pairs 10) 
> 0 

(number-of-pairs (cons (cons 'a 'b) 'c)) 
> 2 

(number-of-pairs '(a b c)) 
> 3 

(number-of-pairs (cons 'a (cons 'b (cons (cons 'c (cons (cons 'd '()) '())) '())))) 
> 6 
+0

stealin 'すべての私のポイント:) – oobivat

2

ルーク!

Err。私はデザインレシピを使用することを意味します。プログラムを設計する方法で

参照セクション9.3と9.4は:

http://htdp.org/2003-09-26/Book/curriculum-Z-H-13.html#node_sec_9.3

あなたはHTDPに慣れていないならば、哲学は体系的プログラムを書くのではなく、単に例を与えるためにあなたのツールを提供することです。

0

コードは今までに1または0を返します。この手順を意図どおりに機能させるには、スキームに関する2つの重要な点を理解する必要があります。再帰呼び出しの仕組みと代入の仕組み。

割り当て:

私はassignment in schemeの非常に綿密な内訳を書いたが、この場合、短いバージョンは(+ x 1)を呼び出すときにxの値を変更していないということです。スキーム内のバインディングの値を実際に変更する場合は、set!プロシージャを使用する必要があります(ただし、この場合は実際に行う必要はありません)。

再帰:あなたは、それ自体の内部からプロシージャを呼び出すときに再帰があることを

リコール。再帰的解には、ヌル値とリダクション式の2つの必要な要素があります。

加算または減算の場合、null値は0、乗算の場合は1、consの場合は空のリスト'()です。

削減式は、問題をより単純な方法に分解する方法、または各手順で問題を解決する方法を示します。

例:

(define count-elements 
    (lambda (lst) 
     (if (null? lst) 0 ; <-- I'm done? return the null value 
      (+ 1 (count-elements (cdr lst)))))) ;<-- otherwise +1 and reduce the problem 

これは宿題ですので、私は明示的にあなたのためにこれを解決することはできませんが、あなたの答えはカウント要素と本質的に同じ形式でなければなりません、あなたは別の述語をちょうど必要があります実際に何かを追加する必要があるかどうかを判断します。

関連する問題