1

この関数は CLisp 関数です。これは宿題の問題の一部ですが、この別の形式 (2 番目の関数) で記述されることになっています。

(defun range (m M) (cond
((> m M) '() )
((= m M) '() )
((< m M) (cons m (range (+ m 1) M ) ) )  
)
)


(define (range m M) (cond
    ((> m M) '() )
    ((= m M) '() )
    ((< m M) (cons m (range (+ m 1) M ) ) )
)
)

これらは両方とも最小値 (m) と最大値 (M) を取り、最小値から最大値までの整数のリストを返す必要があります (最大値 / M-1 を除く)。

私はこれを何度も追跡しましたが、なぜNILを返すだけなのかわかりません。これは非常にばかげた論理の間違いに違いありません。

(range 1 4)  => result (1 2 3)

m=1 | M=4 ==> return (cons 1 (2 3) )
m=2 | M=4 ==> return (cons 2 (3) )
m=3 | M=4 ==> return (cons 3 () )
m=4 | M=4 ==> return ()
    v         ^
    ---------/

私はそれを追跡するように、なぜこれが機能しないのかを理解しようとして夢中になっています。

繰り返しますが、関数を実行すると NIL になります。

4

1 に答える 1

5

SBCLを使用してこれを実行しましたが、変数Mがパラメーターリストに2回表示されると文句を言いました。Lispは変数名に対して大文字と小文字を区別しません。

に変更すると

(defun range (m MM) 
  (cond
      ((> m MM) '() )
      ((= m MM) '() )
      ((< m MM) (cons m (range (+ m 1) MM)))))

それはうまくいきました。

> (trace range)
> (range 1 4)
  0: (RANGE 1 4)
    1: (RANGE 2 4)
      2: (RANGE 3 4)
        3: (RANGE 4 4)
        3: RANGE returned NIL
      2: RANGE returned (3)
    1: RANGE returned (2 3)
  0: RANGE returned (1 2 3)
-> (1 2 3)

CLISPで確認しました。異なる変数名で問題なく動作します。SBCLとは異なり、CLISPはエラーを検出しません。

<[1]> (defun range (m MM) (cond ((>= m MM) '())((< m MM) (cons m (range (+ m 1) MM )))))
RANGE

[2]> (range 1 4)
(1 2 3)

これがあなたのバージョンです:

[3]> (defun range (m M) (cond ((>= m M) '())((< m M) (cons m (range (+ m 1) M)))))

RANGE

[4]> (range 1 4)
Nil
于 2010-10-12T03:59:15.903 に答える