文字間に括弧がないこの例 '(+ * 3 2 - 2 1) をカウントする必要がある場合、どのように電卓をプレフィックス表記に記述できますか? ブラケットがあればなんとかなるのですが、この場合は迷ってしまいます。
1600 次
3 に答える
3
Google で簡単に検索すると、スタックを使用した接頭辞評価の実装 (疑似コード) を含むこのウィキペディア ページが得られました。これは、独自の実装を作成するための出発点です。また、Lisp のリンクされたリストを使用してスタックを簡単に実装できることにも注意してください。先頭に要素を追加/削除するだけです。
于 2013-04-23T16:30:00.240 に答える
0
私はスキームの初心者です(厄介なコードでしたらすみません)。これは括弧付きです:
(define (fce a)
(case a
(( + ) +)
(( - ) -)
(( * ) *)
(( / ) /)))
(define (analyze vyraz)
(if (list? vyraz)
(calcul vyraz)
vyraz))
(define (calcul vyraz)
(if (= (length vyraz) 3 )
((fce (car vyraz)) (analyze (cadr vyraz)) (analyze (caddr vyraz)))
(calcul (cons (calcul (list (car vyraz) (cadr vyraz) (caddr vyraz) (cadddr vyraz)))))))
このコードは、たとえば次のようにカウントできます。(calcul '(- (* 3 2)(+ 1 2))
このコードをブラケットなしのコードに修復したかったのですが、条件と元の入力のリストが私を止めました。元の入力を失わず、最終的な計算も行わないように、条件を記述する方法がわかりません。
私の条件があります(しかし、間違った構文があると思います
(define (count vyraz)
(cond (list? vyraz)
(number? (car vyraz) (cons (car vyraz)))
(number? (cdr vyraz) (cons (cdr vyraz)))
(symbol? (cddr vyraz) (cons (cddr vyraz)))
(else (cdr vyraz) (count vyraz)))
(calcul vyraz))
すべての回答とヒントをありがとう:)
于 2013-04-24T07:40:37.110 に答える
0
(define (polish-notation-eval expr)
(if (finished? expr)
(car expr)
(polish-notation-eval (the-once-over expr))))
;;完成したか、完成に近づくためにもう一度やり直す必要があります。
(define (the-once-over expr)
(cond ((null? expr) expr )
((well-formed-expr? expr)
(cons ((get-operator (car expr)) (cadr expr) (caddr expr))
(the-once-over (cdddr expr))))
(else (cons (car expr) (the-once-over (cdr expr))))))
;; リストを下にスクロールして、評価する整形式を探します。
(define *the-operations*
(list (list '+ +)
(list '* *)
(list '- -)
(list '/ /)))
;; 名前と関数の連想リスト
(define (get-operator name)
(cadr (assoc name *the-operations*)))
;;名前に対応する関数を返します
(define (finished? expr)
(= (length expr) 1))
;; 長さ 1 のリストに到達する 1 つが終了しました。
(define (well-formed-expr? expr)
(and (assoc (car expr) *the-operations*)
(number? (cadr expr))
(number? (caddr expr))))
;;are the next three elements something we can go ahead and evaluate?
于 2013-05-01T02:33:48.263 に答える