3

私はSchemeが初めてで、これが私の最初の関数型言語です。ほとんどすべてを再帰的に実装することは、私にとって厄介なようです。それにもかかわらず、単一の整数入力を持つ階乗およびフィボナッチ問題の関数を実装することができました。

しかし、関数にリストの入力がある場合はどうでしょうか? この演習を仮定します:

FUNCTION: ret10 - 指定されたリストで見つかった 10 より大きいすべての数値を抽出してリストとして返します。 guile> (ret10 '(xe (hn) 1 23 12 o)) OUTPUT: (23 12)

これで関数の引数として(c(list) を定義) する必要がありますか? または他の方法はありますか?

助けてください。ありがとう!


以下は、オスカー・ロペス卿の回答に基づいた私の派生ソリューションです..これが他の人に役立つことを願っています:

(define (ret10 lst)
    (cond
        ((null? lst) '())

        ((and (number? (car lst)) (> (car lst) 10))
            (cons (car lst)
            (ret10 (cdr lst))))

        (else (ret10 (cdr lst)))
    )
)
4

2 に答える 2

4

入力としてリストを受け取り、出力として別のリストを返すこの種の問題には、よく知られたソリューションのテンプレートがあります。まず、 The Little SchemerまたはHow to Design Programs を読むことをお勧めします。どちらの本も、ソリューションについて考え始める正しい方法を教えてくれます。

最初に、同様の問題を解決する方法を紹介します。つまり、リストをそのままコピーします。これにより、ソリューションの一般的な構造が示されます。

(define (copy lst)
  (cond ((null? lst)                ; if the input list is empty
         '())                       ; then return the empty list
        (else                       ; otherwise create a new list
         (cons (car lst)            ; `cons` the first element
               (copy (cdr lst)))))) ; and advance recursion over rest of list

上記があなたの問題にどのように関係しているかを見てみましょう。明らかに、再帰の基本ケースは同じです。違いは、それが数値で (ヒント:手順を使用) それが より大きい場合にのみcons、リストの残りの部分を持つ最初の要素であることです。条件が満たされない場合は、consing せずに再帰を進めます。一般的な考え方は次のとおりです。空白を埋めます。number?10

(define (ret10 lst)
  (cond (<???> <???>)          ; base case: empty list
        (<???>                 ; if the condition holds
         (cons <???>           ; `cons` first element
               (ret10 <???>))) ; and advance recursion
        (else                  ; otherwise
         (ret10 <???>))))      ; simply advance recursion

それをテストすることを忘れないでください:

(ret10 '(x e (h n) 1 23 12 o))
=> '(23 12)

最後の注意: 通常、この問題はfilterプロシージャを使用して解決します。このプロシージャは、入力としてリストを受け取り、指定された述語を満たす要素のみを含む別のリストを出力として返します。「手作業で」ソリューションを作成する方法を学び、理解したらfilter、さまざまなアプローチを比較するために、それを使用してソリューションを見て、作成します。

于 2013-08-03T02:55:37.157 に答える
0

リストの最初の要素とリストの残りの再帰の問題を解決します。必ず終了条件 (リストはnull?) を処理し、結果を結合してください (consまたはappend以下)。

(define (extract pred? list)
  (if (null? list)
      '()
      (let ((head (car list))
            (rest (cdr list)))
        (cond ((pred? head) (cons head (extract pred? rest)))
              ((list? head) (append (extract pred? head)
                                    (extract pred? rest)))
              (else (extract pred? rest))))))

(define (ret10 list)
  (extract (lambda (x) (and (number? x) (> x 10))) list))

> (ret10 '(0 11 (12 2) 13 3))
(11 12 13)
于 2013-08-04T00:28:48.437 に答える