3

私の質問は、どのようにコーディングするのですか

(triangle 5) produces (list "*****" "****" "***" "**" "*")

注: (アスタリスク 5、4、3、2、1)。これまでのところ、私は持っています:

(define (triangle n)
  (cond
    [(zero? n) empty]
    [else (cons n (triangle (sub1 n)))]))

しかし、それは私に与えるだけです(list 5 4 3 2 1)。これはスキームの初心者リストと略語の基本のみを使用することに注意してください. ありがとう!

4

3 に答える 3

4

複雑な問題をより単純で短いサブパートに分割することは、常に良い考えです。この場合、次のように、最初に部分問題の解決策を書くことで、一般的な解決策を単純化できます。

  1. 最初に、文字列のリストを作成するプロシージャを作成します。ここで、文字列は"*****"or"****"または ... または"*"
  2. 次に、repeat文字列と数値を指定して、その文字列を何度も繰り返すヘルパー プロシージャを作成します。たとえば、次の(repeat "*" 3)ように返されます。"***"

最初の部分問題が 2 番目の部分問題でどのように表現されるかは簡単にわかります。これは宿題のように見えるので、ここで完全な解決策を求めるべきではありません。自分で答えにたどり着く方が便利です。一般的な考え方は次のとおりです。空欄を埋めてください。

(define (triangle n)
  (cond [<???> <???>]                 ; if n is zero return the empty list: '()
        [else                         ; otherwise
         (cons <???>                  ; cons n repetitions of * (using `repeat`)
               (triangle <???>))]))   ; and advance the recursion

(define (repeat str n)
  (cond [<???> <???>]                 ; if n is zero return the empty string: ""
        [else                         ; otherwise
         (string-append <???>         ; append the given string
             (repeat <???> <???>))])) ; and advance the recursion

注意深く見ると、両方の手順がまったく同じ構造を共有しています。変更点は、基本ケース (空のリストと空の文字列) で返される値と、部分的な回答 (consおよびstring-append) を結合するために使用される手順です。

于 2013-03-10T21:57:13.773 に答える
1

数値を文字列に変換する方法を探しているだけの場合は、を使用できます(number->string x)

ただし、数字をアスタリスクで表すことを検討しているため、一連のアスタリスクを作成するまで、数字を数字として保持する方がよい場合があります。その場合、おそらく次のような方法が必要です。

(define (num-to-asterisks x)
        (make-string x #\*))
于 2013-03-10T21:52:54.737 に答える
0

これを試して:

(define (triangle n)
  (let building ((i 0) (r '()))
    (if (= i n)
        r
        (building (+ i 1)
                  (cons (string-append "*" (if (null? r) "" (car r)))
                         r)))))

これはうまく末尾再帰的です。結果リストの最初の要素に「*」を追加して、結果リストを作成します。

于 2013-03-11T00:48:26.187 に答える