0

リストからすべての値を取得し、すべての値が-1であるリストを返すプロシージャを作成しました(たとえば)

(define (Set-list a val)
  (if ( null? a) (list)
    (append (list val) (Set-list (cdr a) val))
))

(Set-list '(2 3 4) -1) //returns '(-1 -1 -1)
(Set-list '(A(2 3) B(2 3) C(2 3)) -1) // returns '(-1 -1 -1 -1 -1 -1)

-1 -1 -1 を返すようにするにはどうすればよいですか? リストの内部メンバーを取得したくありませんか?

4

4 に答える 4

1

Anton が慣用的な解決策について言及したので、Racket での私の慣用的な解決策を次に示します (私は、mapfilter-not、および のような高階関数の使用は、間違いなくconst、手動でループしてフィルタリングするよりも慣用的であると信じています)。:-)

(define (set-list lst val)
  (map (const val) (filter-not list? lst)))

(Racket は提供しますが、目的とは逆の順序でandをfilter-map適用します。)filtermap

于 2013-01-13T17:42:05.717 に答える
1

おそらく、Scheme でリストがどのように機能するかを混乱させているのではないでしょうか。この list:'(A(2 3) B(2 3) C(2 3))、この list: とまったく同じです'(A (2 3) B (2 3) C (2 3))。つまり、6 要素のリストです。symbol-and-numbers の組み合わせを 1 つの要素として扱いたい場合は、それらを 1 つのリストにまとめます。'((A 2 3) (B 2 3) (C 2 3))

補足として、set-list手順の記述方法は慣用的ではありません。特にappend、リストを作成するときに先頭に要素を配置するのに使用するのは最善の方法ではありません。そのために使用consしてください。これは、プロシージャを記述するためのより良い方法です。

(define (set-list a val)
  (if (null? a)
      '()
      (cons val
            (set-list (cdr a) val))))

さて、上記の私のアドバイスに従って、それがどのように機能するかは次のとおりです。

(set-list '((A 2 3) (B 2 3) (C 2 3)) -1)
=> '(-1 -1 -1)

アップデート:

さて、リストの仕組みに誤解がなく、リスト内のすべてのサブリストを特定の値に置き換えたいだけなら、これでうまくいきます:

(define (set-list a val)
  (build-list (length (filter (negate list?) a))
              (lambda (x) val)))
于 2013-01-13T16:17:54.123 に答える
0

指定されたリストの長さと同じ長さの値のリストを作成する場合は、

(define (set-list list value)
    (build-list (length list) (lambda (x) value)))

それで、

(set-list '(2 3 4) -1) //returns '(-1 -1 -1)
(set-list '(A (2 3) B (2 3) C (2 3)) -1) // returns '(-1 -1 -1 -1 -1 -1)
(set-list '(2 3 4) -2) //returns '(-2 -2 -2)
(set-list '(A (2 3) B (2 3) C (2 3)) -2) // returns '(-2 -2 -2 -2 -2 -2)
于 2013-02-02T02:15:24.203 に答える
0

これが私の試みです(おそらく慣用的なスキームではありませんappend。とにかくそれを行うのは間違っていることに注意してください)。コメントで説明したように、サブリストを完全にスキップしたいと思います。

(define (Set-list a val)
  (if (null? a)
      (list)     
      (append (if (list? (car a))
                  (list)
                  (list val))
              (Set-list (cdr a) val))))
于 2013-01-13T16:25:51.417 に答える