3

私は現在、「The Little Schemer」の第 4 版を読んでいます。初期の演習の 1 つinsertRは、リスト内の特定の値の右側に値を挿入する関数を作成することです。この本は最終的に次の定義に到達します。

(define insertR
  (lambda (new old lat)
    (cond
      ((null? lat) (quote ()))
      (else (cond
              ((eq? (car lat) old)
               (cons old
                     (cons new (cdr lat))))
              (else (cons (car lat)
                          (insertR new old
                                   (cdr lat)))))))))

私自身の定義は次のようになりました。

(define insertR
  (lambda (new old lat)
    (cond
      ((null? lat) (quote ()))
      ((eq? (car lat) old) (cons old (cons new (cdr lat))))
      (else (cons (car lat) (insertR new old (cdr lat)))))))

それらは同等ですか?

4

4 に答える 4

3

もちろん、両方の定義は同等ですが、あなたの定義の方が読みやすいです。あなたは本の第 3 章にいるだけであり、著者はゆっくりと進みたいと考えていることを心に留めておいてください。cond同じ章の後半の 41 ページでは、フォームをネストする代わりに、すべての相互に排他的な条件を単一のフォームで処理するという、あなたが行っている単純化の種類を正確に教えてくれますcond

于 2012-09-23T18:19:25.613 に答える
3

はい、2 つの定義の動作は同じです。

この本に が 2 つcondある理由は、それらが 2 つの異なる目的を果たしているからです。外側condは、リスト データ型の 2 つのケースを区別します (リストは、nullまたはcons2 番目の引数がリストである)。外部condは、消費されるデータのタイプによって決まります。リスト上のすべての構造的に再帰的な関数には、そのアウターがありcondます。内部condは、定義されている特定の関数に固有です。

したがって、それらを組み合わせるとよりコンパクトになりますが、それらを分離したままにすることで、関数の構造が再帰型の構造により明確に対応します。このイディオムを一貫して使用すると、構造的に再帰的な関数の読み取り、デバッグ、保守が容易になります。

于 2012-09-24T02:22:06.933 に答える
3

Ryan と同じことを言います: 読みやすさは、正確さに次ぐものです。実際、あなたが学生であれば、正確さよりも読みやすさの方が重要かもしれません。

本に登場するバージョンの利点は、1 つが空であることをテストする 2 つの腕を持つコンドがあることです。これは、問題を解決するための完全に正常で予想される方法です。この分割を見ると、2 つのコード ブロックの役割がすぐに理解できます。あなたのコードでは、3 つのケースが網羅的で相互に排他的であることを確認するために立ち止まって時間を費やし、どの入力がどのビンに分類されるかを推測する必要があります。

午後 11 時 52 分、疲れていて、目が痛いです。学生が書いた同じ問題の 45 を超える解決策を読んでいます。私はCLARITYを探しています、くそー。あなたがそれを正しくやったことが明らかな方法で解決策を書くことができれば、私はあなたに100%を与え、あなたの名前を祝福します.

于 2012-09-24T06:54:02.617 に答える
2

はい、あなたのほうが読みやすいと思いますが。cond複数の句をサポートし、そのうちの 1 つが値に評価されるまでそれぞれを評価しtrueます。したがって、次のようになります。

(else (cond
        ((eq? (car lat) old) (cons old (cons new (cdr lat))))
        (else (cons (car lat) (insertR new old (cdr lat)))))))))

2 番目の最初の句を最初の句に移動するのと同じですcond

(cond
  ((null? lat) (quote ()))
  ((eq? (car lat) old) (cons old (cons new (cdr lat))))
  (else (cons (car lat) (insertR new old (cdr lat)))))))

おそらく、この本の著者は、終末null状態を他の 2 つの状態から分離する方が明確だと考えていたのifでしょうcond

于 2012-09-23T17:39:51.417 に答える