1

入力のペアの数を数える必要がある割り当てがあります。

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

(define x 0)

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

そして、私はそれを次のように使用します:

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

ここでは2を生成するはずですが、関数を1回だけ実行するため、代わりに1を生成します。やってみたら

(number-of-pairs 10)

ペアがないため、0が生成されます。

4

3 に答える 3

5

次の2つのケースを考慮する必要があります。

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

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

何をする必要があるかについての一般的な考え方は次のとおりです。空欄に記入してください。

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

手順をテストするには、次の例を使用してください。

(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
于 2012-04-30T19:21:43.733 に答える
2

力ルークを使用!

エラー。デザインレシピを使うという意味です。

プログラムの設計方法のセクション9.3および9.4を参照してください。

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

HtDPに慣れていない場合、哲学は、単なる例を示すのではなく、プログラムを体系的に作成するためのツールを提供することです。

于 2012-04-30T18:31:59.237 に答える
0

現在記述されているように、コードは1または0のみを返します。このプロシージャを意図したとおりに機能させるには、スキームに関する2つの重要なことを理解する必要があります。再帰呼び出しのしくみと割り当てのしくみです。

割り当て:

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

再帰:

再帰とは、プロシージャ自体の内部から呼び出す場合であることを思い出してください。再帰的解法には、null値と還元式の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

これは宿題なので、明示的に解決することはしませんが、答えは基本的にcount-elementsと同じ形式である必要があります。実際に何かを追加する必要があるかどうかを判断するには、別の述語が必要です。

于 2012-04-30T18:42:56.963 に答える