2017-02-04 8 views
0

インナーリダクションとアウターリダクションは、異なるものを引き起こすものではない場合、常に同じ値を作成しますか?内側と外側の縮小、同じ結果ですか?

私は機能的な言語であるラケットについて話しています。

私は、ラケットのように実際に異なる結果を引き起こすようなより効率的な可能性を知っています。私はそれが起こるケースを作成することができませんでしたが、私はそれが可能でなければならない、おそらく知らないと危険なことがあるように感じます。

例:

;inner reduction 
    (sqr (* 3 (+ 1 (sqr 2)))) 
     ->(sqr (* 3 (+ 1 (* 2 2))) ;(sqr) 
     ->(sqr (* 3 (+ 1 4)) ;(*) 
     ->(sqr (* 3 5)) ;(+) 
     ->(sqr 15) ;(*) 
     ->(* 15 15) ;(sqr) 
     ->225 ;(*) 

;outer reduction 
    (sqr (* 3 (+ 1 (sqr 2)))) 
     ->(* (* 3 (+ 1 (sqr 2))) (* 3 (+ 1 (sqr 2))) ;(sqr) 
     ->(* (* 3 (+ 1 (* 2 2))) (* 3 (+ 1 (sqr 2))) ;(sqr) 
     ->(* (* 3 (+ 1 4)) (* 3 (+ 1 (sqr 2))) ;(*) 
     ->(* (* 3 5) (* 3 (+ 1 (sqr 2))) ;(+) 
     ->(* 15 (* 3 (+ 1 (sqr 2))) ;(*) 
     ->(* 15 (* 3 (+ 1 (* 2 2))) ;(sqr) 
     ->(* 15 (* 3 (+ 1 4))) ;(*) 
     ->(* 15 (* 3 5)) ;(+) 
     ->(* 15 15) ;(*) 
     ->225 ;(*) 

答えて

1

など、私はラケットを知りませんが、あなたの表現のいずれかが入力/出力をやって、そのような変数を変更するなどの副作用を、持っている場合、一般的に、あなたはトラブルに実行することができます

(define x 1) 
(sqr (begin (set! x (add1 x)) x)) 

インナー削減:

は、次の例を見てみましょう

I.e.結果は4であり、最終値はx2です。外側の減少と

、あなたが得る:

; x = 1 
(* (begin (set! x (add1 x)) x) 
    (begin (set! x (add1 x)) x)) 

; x = 2 
(* (begin x) 
    (begin (set! x (add1 x)) x)) 

; x = 2 
(* 2 
    (begin (set! x (add1 x)) x)) 

; x = 3 
(* 2 
    (begin x)) 

; x = 3 
(* 2 
    (begin x)) 

; x = 3 
(* 2 
    3) 

; x = 3 
6 

すなわち、結果は6であり、最終値はx3です。


さらに別の違いがあります。

(define (my-if c t e) 
    (if c t e)) 

(define (loop) 
    (loop)) 

(my-if #t 42 (loop)) 

外の減少で:内側の減少と

(my-if #t 42 (loop)) 
; definition of 'my-if' 
(if #t 42 (loop)) 
; built-in 'if' 
42 

:内側の減少と、それはあなたがすべてで結果を得ることはありません可能性があります

(my-if #t 42 (loop)) 
; definition of 'loop' 
(my-if #t 42 (loop)) 
; definition of 'loop' 
(my-if #t 42 (loop)) 
; definition of 'loop' 
(my-if #t 42 (loop)) 
; definition of 'loop' 
... 

これが終了したことがありません。

+0

@Xanlantos https://docs.racket-lang.org/guide/set_.htmlから構文を取得しました。ラケットじゃない? – melpomene

+0

@Xanlantos 'set! 'を使わない2番目の例を追加しました。 – melpomene

+0

@Xanlantosあなたの先生が 'set! 'を知っているとは思っていますが、あなたの先生はそれを使わずにプログラムする方法を教えようとしています。 – molbdnilo

関連する問題