-1

戦う騎士のリストを 1 つ受け取る関数を作成しています。彼らの戦いを実行しているコードは機能しています (馬上槍試合)。今、私はトーナメント システムを書いていますが、トーナメント ラウンドを機能させることができません。先ほど言ったように、騎士のリストを受け取り、全員が戦うまで再帰的に戦わせ、勝者と敗者の 2 つのリストを返します。知っていることはすべて試しましたが、何をしてもエラーが発生し、コードが機能しなくなり、その理由がわかりません。これまでに書いたものは次のとおりです。

(define (playTourneyRound knightList)
    (
        (cond 
            ((> (length knightList) 1)
                (let (
                    (winner (jousting-game (car knightList) (cadr knightList)))
                    (winners (list))
                    (losers (list))
                    (results (playTourneyRound (cddr knightList)))
                )
                (if (= winner 1) (winners (append winners (list (car knightList)))) (winners (append winners (list (cadr knightList)))))
                (winners (append (car results)))
                (losers (list (cadr knightList) (cadr results)))
                (list winners losers)
                )
            )
            ((= (length knightList) 1)
                (list knightList)
            )
        )
        (list '() '())
    )
)

「Call of non-procedure: #」というエラーが表示される理由と、今後このエラーを回避するにはどうすればよいですか? 私は、scheme/lisp について重要なことを理解していないだけだと確信しており、実際に説明を使用することができます。

すべての助けをありがとう、問題は解決されました

4

2 に答える 2

1

まず、スキームがレキシカルスコープであることを知っておくべきだと思います。変数宣言は、宣言されているコード フレームまたは子フレームでのみ意味があります。

また、内側のセットが関数を返し、それを適用したい場合を除き、二重括弧で開きましたが、これは通常、やりたいことではありません。

あなたのきれいな印刷は途方もないです。Condステートメントは 1 行にするか、句の 2 番目の括弧に並べる必要があります。Ifには 3 つの句しかありませんが、すべて同じ行に配置するか、最初の引数に合わせて後続の行に配置する必要があります。ステートメントの関数本体は、letlet の「e」または「t」に並べる必要があります。独自の行の末尾のパルネテーゼは、一般的に眉をひそめます。

リストの長さに対する O(n) 操作と同様に、再帰で length を繰り返し呼び出すのは悪い形式lengthです。リストが null であるか、cdr が null であるかを確認するだけです。

そして、あなたがやろうとしていることを実行するには、内部機能が本当に必要です。(内部定義、letrec、または名前付き let が行います)

(append <some-list> (list <some list element>))あなたがそれをうまくやっていないように追加している場合。最初のオフappendは、最初の引数の長さまで O(n) です。逆の順序で結果を累積し、最後にそれを逆にするだけです。

  (define (playTourneyRound knightList)
     (let loop ((knights-L knightList) ;;named let
                (winners (list))
                (losers (list)))
       (cond ((null? knight-L) (map reverse (list winners losers))) ;;length = 0
             ((null? (cdr knight-L)  ;;lenght = 1
              (loop (cdr knight-L)                                                
                    (cons (car knight-L) winners)
                    losers))
             (else       ;; length > 1
              (let* ((winner (jousting-game (car knight-L) (cadr knight-L)))
                        ;;assuming that jousting-game return the winning knight
                     (loser (if (equal? winner (car knight-L))
                                (cadr knight-L)
                                (car knight-L))))
                 (loop (cddr knight-L)
                       (cons winner winners)
                       (cons loser losers)))))))    
于 2014-03-06T18:07:22.880 に答える