1

ネストされたリストのリストから最大値を取得する関数を作成しました。関数の一般的な形式は右下にあります。フラットリストとネストされたリストで機能しますが、兄弟のネストされたリストがあると失敗するようです。

これが私のコードです:

(define (multi-max array)
  (cond
    ((null? array) 0)
    ((number? (car array))
      (if (> (car array) (multi-max (cdr array)))
       (car array)
       (multi-max (cdr array))))
    ((pair? (car array))
     (multi-max (car array)))
    (else
     (multi-max (cdr array)))))

失敗するテストリストは次のとおりです。(multi-max '(1 9 83 9 (332 (334) (2 3 4224))))

論理的にどこが間違っているのかわからないので、助けていただければ幸いです。

4

1 に答える 1

3

論理エラーを見つけられなかったので、より再帰的な方法で書き直しました:)
関数を作成する前に、まず再帰的な部分を特定することが重要です。

multi-max再帰的に次のように定義できますmulti-max = max(multi-max(car), multi-max(cdr))

(define (multi-max array)
  (cond ((pair? array) (max (multi-max (car array)) (multi-max (cdr array))))
        ((number? array) array)
        (else 0)))

(multi-max '(1 9 83 9 (332 (334) (2 3 4224))))
現在、を出力します4224

編集:わかりました、私はエラーを見つけたと思います:

...
((pair? (car array))
 (multi-max (car array)))
(else
 (multi-max (cdr array))))
...

(cdr array)コードは、(pair? )パーツとパーツのを無視し(car array)
ます(else )

そのはず:

(else (max (multi-max (car array)) (multi-max (cdr array))))

(pair? )(*)が削除されていることに注意してください。

于 2010-01-09T09:01:02.757 に答える