非負の整数のリストを受け取り、その値に等しい回数を表す各値を順番に含むリストを返す、Scheme プロシージャ (repeats-a-lot lst) を完了します。以下の例を参照してください。ソリューションでリバースを使用できます。また、ソリューション内でヘルパー プロシージャを使用することもできます。また、このページの後半でより多くのスペースを確保することもできます。
注: これは宿題ではありません。練習問題なので答えられません
非負の整数のリストを受け取り、その値に等しい回数を表す各値を順番に含むリストを返す、Scheme プロシージャ (repeats-a-lot lst) を完了します。以下の例を参照してください。ソリューションでリバースを使用できます。また、ソリューション内でヘルパー プロシージャを使用することもできます。また、このページの後半でより多くのスペースを確保することもできます。
注: これは宿題ではありません。練習問題なので答えられません
空白を埋めて、この練習問題を自分で解決できるように、いくつかのヒントを示します。あなたができる最初のそしておそらく最も有用なことは、問題を2つの手順に分割することです。最初のものは、番号が与えられると、次の繰り返しをn
含むリストの作成を処理します。i
n
(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)