0

私はSchemeにかなり慣れていないので、特定のリスト内のすべての数値を再帰的に立方体にする方法を考えていましたが、これは私が持っているものです:

(define (cube-it-list lst)
  (cond [(empty? lst) empty]
        [else (cons (cube-it (first lst)) 
                    (cube-it-list (rest lst)))]))

しかし、プログラムを実行するたびにエラーが発生し、なぜ誰かが助けたり、これを行うためのより効率的な方法を考え出すことができるのかわかりません。

4

2 に答える 2

2

関数は問題ないように見えますが、問題はcube-itプロシージャまたは呼び出し方法にある可能性があります。たとえば、これは機能します:

(define (cube-it x)
  (* x x x))

(define (cube-it-list lst)
  (cond
    [(empty? lst)
     empty]
    [else
     (cons (cube-it (first lst))
           (cube-it-list (rest lst)))]))

(cube-it-list '(1 2 3 4 5))
=> '(1 8 27 64 125)

「これを行うためのより効率的な方法」については、@ svkの回答に固執しmap、入力リストについて、入力リストの各要素に関数を適用することを含むこのタイプの問題を解決する慣用的な方法です。結果を含む出力リストを生成します。

(map cube-it '(1 2 3 4 5))
=> '(1 8 27 64 125)
于 2013-03-27T00:03:31.460 に答える
1

関数 cube-it を定義しましたか? 私がやったとき、あなたのコードは私のために働いた。

いずれにせよ、Scheme にはまさにこの種のことのための構造があります: 各要素に変換を適用することによって、別のリストから 1 つのリストを作成します。それはマップと呼ばれます:

(map cube-it '(1 2 3 4 5))
=> '(1 8 27 64 125)

map が単一の変換操作に限定されないことを除いて、基本的にここで再発明しました。使用する関数を最初の引数として渡します。

(注:再帰的なソリューションを実装するように明確に指示されている場合は、元のコードに固執する必要があります。map は内部で再帰を使用しますが、map を使用すると、独自のコードでこの場合の再帰を使用する必要がなくなります。)

于 2013-03-26T23:39:38.337 に答える