Skip to content

Latest commit

 

History

History
100 lines (64 loc) · 2.66 KB

solucao-3.54.org

File metadata and controls

100 lines (64 loc) · 2.66 KB

Solução do exercício 3.54 do SICP

Solução

O exercício exige o uso de um stream-map generalizado para N streams. Utilizei o código do Alifer da solucao-3.50.rkt, apenas substituindo o cons-stream, car-stream e cdr-stream pelos seus equivalentes na documentação do Racket:

(define (stream-map proc . argstreams)
  (if (stream-empty? (car argstreams))
      empty-stream
      (stream-cons
       (apply proc (map stream-first argstreams))
       (apply stream-map
              (cons proc (map stream-rest argstreams))))))

Exercise 3.54: Define a procedure mul-streams, analogous to add-streams, that produces the elementwise product of its two input streams. Use this together with the stream of integers to complete the following definition of the stream whose nth element (counting from 0) is n + 1 factorial:

(define factorials (stream-cons 1 (mul-streams <???> <???>)))

Em primeiro lugar, é preciso definir mul-streams. Análogo a add-streams, ele tem como input duas streams e aplica o procedimento primitivo *.

Assim:

(define (mul-streams s1 s2) (stream-map * s1 s2))

Queremos, agora, modelar a fatorial de n+1, levando em consideração que a contagem deve começar em n = 0.

Vamos utilizar o procedimento do SICP add-streams e as streams ones e integers:

(define (add-streams s1 s2) (stream-map + s1 s2))

(define ones (stream-cons 1 ones))

(define integers (stream-cons 1 (add-streams ones integers)))

Finalmente, temos a stream factorials:

(define factorials
  (stream-cons 1 (mul-streams integers factorials)))

Teste

Não consegui ser muito criativo nos testes, então acho que é algo a se aprimorar.

Teste do Mul-streams

(define a integers)
(define b integers)

(define quadrado-dos-naturais (mul-streams a b)) ; deveria retornar os quadrados dos integrais

(define (teste)
  (begin
    (displayln(stream-first quadrado-dos-naturais))
    (displayln(stream-first (stream-rest quadrado-dos-naturais)))
    (displayln(stream-first(stream-rest (stream-rest quadrado-dos-naturais))))
    (displayln(stream-first(stream-rest(stream-rest (stream-rest quadrado-dos-naturais)))))))

(teste)

Teste do Factorials

(define (teste-factorials)
  (begin
    (displayln(stream-first factorial))
    (displayln(stream-first (stream-rest factorials)))
    (displayln(stream-first(stream-rest (stream-rest factorials))))
    (displayln(stream-first(stream-rest(stream-rest (stream-rest factorials)))))))

(teste-factorials)