1

非負の整数のリストを受け取り、その値に等しい回数を表す各値を順番に含むリストを返す、Scheme プロシージャ (repeats-a-lot lst) を完了します。以下の例を参照してください。ソリューションでリバースを使用できます。また、ソリューション内でヘルパー プロシージャを使用することもできます。また、このページの後半でより多くのスペースを確保することもできます。

注: これは宿題ではありません。練習問題なので答えられません

4

1 に答える 1

0

空白を埋めて、この練習問題を自分で解決できるように、いくつかのヒントを示します。あなたができる最初のそしておそらく最も有用なことは、問題を2つの手順に分割することです。最初のものは、番号が与えられると、次の繰り返しをn含むリストの作成を処理します。in

(define (repeat n i)
  (if (zero? i)               ; if no more repeats are needed
      <???>                   ; return the empty list
      (cons <???>             ; else cons `n` and advance the recursion
            (repeat <???>     ; `n` is left unchanged
                    <???>)))) ; but `i` is diminished by one

2番目の手順では、前の手順をヘルパーとして使用し、入力を反復処理して、次lstのように生成されたすべてのサブリストの結果を結合しますrepeat

(define (repeats-a-lot lst)
  (if (null? lst)                      ; if the list is empty
      <???>                            ; return the empty list
      (append (repeat <???> <???>)     ; append n repetitions of current element
              (repeats-a-lot <???>)))) ; and advance the recursion over the list

この問題を解決する方法はいくつかありますが、いくつかのより巧妙な方法(末尾再帰の使用、折り畳み手順の使用など)がありますが、このIMHOは、基本的なリスト操作手順の知識のみが必要であるという意味で、最も簡単な方法です。とにかく、それは期待どおりに機能します:

(repeats-a-lot '(1 2 3))
=> '(1 2 2 3 3 3)
于 2012-12-15T00:30:53.027 に答える