Você está na página 1de 12

Lazy Evaluation

Avaliação Preguiçosa

Larissa Dantas
Edson Ferreira
Lazy Evaluation
Avaliação Preguiçosa

Larissa Dantas
Edson Ferreira
Avaliação de subexpressão ! Avaliação de função
Função: Avaliação posterior -> AVALIA EM TEMPO DE EXECUÇÃO

Subexpressão: Avaliação anterior -> AVALIA E DEPOIS EXECUTA

Problema: usar os dois ao mesmo tempo pode provocar um loop infinito


Exemplo:
(define (my-if-bad x y z) (if x y z))

(define (factorial-wrong x)

(my-if-bad (= x 0) <- conflito de avaliações

(* x (factorial-wrong (- x 1)))))
Reduz o custo computacional
Como permite fazer delays na execução e associada com a pré-computação dos
valores, é possível calcular um valor que demanda um custo computacional
elevado e armazená-lo. A próxima vez que precisar deste valor novamente utiliza
o valor pré-computado. Economizando recursos computacionais e de tempo de
processamento.
Fatorial
Complexidade de Computação : O(n!)
Computar o valor e usar quando

necessário da primeira vez: O(n!)

Acessar o valor já computado: O(1)


Código
Fatorial com Delayed Evaluation

#lang racket Chamada da função :


(define (fatorial n) (define a (my-delay (lambda() (fatorial 100))))
(if( <= n 1 )
1 (my-force a)
(* n (fatorial (- n 1)))

(define (my-delay f)
(mcons #f f))
(define (my-force th)
(if (mcar th)
(mcdr th)
( begin (set-mcar! th #t)
(set-mcdr! th ((mcdr th)))
(mcdr th))))
Avaliação de subexpressão ! Avaliação de função
Função: Avaliação posterior -> AVALIA EM TEMPO DE EXECUÇÃO

Subexpressão: Avaliação anterior -> AVALIA E DEPOIS EXECUTA

Problema: usar os dois ao mesmo tempo pode provocar um loop infinito


Exemplo:
(define (my-if-bad x y z) (if x y z))

(define (factorial-wrong x)

(my-if-bad (= x 0) <- conflito de avaliações

(* x (factorial-wrong (- x 1)))))
Reduz o custo computacional
Como permite fazer delays na execução e associada com a pré-computação dos
valores, é possível calcular um valor que demanda um custo computacional
elevado e armazená-lo. A próxima vez que precisar deste valor novamente utiliza
o valor pré-computado. Economizando recursos computacionais e de tempo de
processamento.
Fatorial
Complexidade de Computação : O(n!)
Computar o valor e usar quando

necessário da primeira vez: O(n!)

Acessar o valor já computado: O(1)


Código
Fatorial com Delayed Evaluation

#lang racket Chamada da função :


(define (fatorial n) (define a (my-delay (lambda() (fatorial 100))))
(if( <= n 1 )
1 (my-force a)
(* n (fatorial (- n 1)))

(define (my-delay f)
(mcons #f f))
(define (my-force th)
(if (mcar th)
(mcdr th)
( begin (set-mcar! th #t)
(set-mcdr! th ((mcdr th)))
(mcdr th))))