1

I have a recursive function that basically keeps appending elements to a list recursively until a condition has been met. There's an issue though, and that's to use append, we must give it a quoted list. So doing

 (append (1 2) 3)

gives us an error.

The problem is when I first pass a list to the argument, I can put the ' to make it a quoted list. However, once I append something to that list and it gets recursively passed to the same function again, the second time append tries to work, it will see the list is no longer quoted, so Scheme thinks it's a procedure rather than a list. Let me show you a simplified version of the code:

 (define simple
   (lambda (x y)
      (if (equal? x '()) 
          (display 'success!)
          (simple (cdr x) (append y (car x))))))

We run the function by doing (simple '(1 2 3) '()) I realize the program above is useless; it's just to demonstrate what I'm saying.

Thanks!

4

2 に答える 2

1

あなたが投稿したコードの問題は、Scheme が手続きとリストを混同していることではありません。問題は への呼び出しにありappendます。

デバッグ時にプロシージャの実行をトレースすると役立つ場合があります。Petite Chez スキームを使用して、simpleとのトレースをオンにしてコードを実行すると、次のようになります。appendtrace-define

> (simple '(1 2 3) '())
|(simple (1 2 3) ())
| (append () 1)
| 1
|(simple (2 3) 1)
| (append 1 2)

(append () 1)を返すため1、 への最初の再帰呼び出しでsimpleは、2 番目の引数は1リストではありません。そのため、次の への呼び出しでエラーが発生しますappend

(car x)への呼び出しで呼び出しをラップすることで修正できますlist

(define simple
  (lambda (x y)
    (if (equal? x '()) 
        (display 'success!)
        (simple (cdr x) (append y (list (car x)))))))

実行中の修正バージョンのトレースは次のとおりです。

> (simple '(1 2 3) '())
|(simple (1 2 3) ())
| (append () (1))
| (1)
|(simple (2 3) (1))
| (append (1) (2))
| (1 2)
|(simple (3) (1 2))
| (append (1 2) (3))
| (1 2 3)
|(simple () (1 2 3))
success!|#<void>
于 2013-03-22T04:02:05.353 に答える
0

リストの末尾に要素を追加するには、要素をリスト内に配置します (はリスト間でのみappend定義されます)。たとえば、コードで次のようにします。

(append y (list (car x)))

もちろん、このままでは手続きが何もしないことに変わりはありません。少なくとも、 に蓄積された値を返しますy

(define simple
  (lambda (x y)
    (if (equal? x '())
        y
        (simple (cdr x)
                (append y (list (car x)))))))
于 2013-03-22T03:51:06.937 に答える