Jump to content
Marisacruz

Ajuda em Sheme

Recommended Posts

Marisacruz

Ola sera que algem podia ajudar-me a resolver estes procedimentos? É que tenho a prova na proxima quarta feira e se alguem souber resolver estes procedimentos agradeço desde ja.

Escreva um procedimento denominado binaria que dado um inteiro par n, devolva uma stream composta por uma sequencia de valores que observe o seguinte padrão.

(binaria 0) -> (0 1 0 1 0 1.....)

(binaria 4) -> (4 5 4 5 4 5 .....)

___________________________________

Escreva um procedimento denomidado divisiveis que dados dois inteiros positivos x e y, devolva uma stream de todos os inteiros maiores do que 0 que sejam divisiveis por x ou por y. A stream retornada pelo procedimento deve deve disponibilizar os inteiros por ordem crescente. Caso entenda necessario poderá escrever procedimentos auxiliares.

exemplo

(divisiveis 2 3) -> ( 2 3 4 6 8 9 10 12 14 15.....)

(divisiveis 4 7) -> (4 7 8 12 14 16 20 21 24 28.........)

Share this post


Link to post
Share on other sites
Andrepereira9

Ola MarisaCruz. Bem vinda ao fórum

Qual é a linguagem?


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
Marisacruz

Ola MarisaCruz. Bem vinda ao fórum

Qual é a linguagem?

A linguagem é Dr.Scheme

Share this post


Link to post
Share on other sites
Andrepereira9

Peço desculpa, mas realmente quem devia de ter mais atenção era eu e não a MarisaCruz.

Eu não reparei que estava escrito no titulo a linguagem, e foi por isso que perguntei.


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
rolando2424

Escreva um procedimento denomidado divisiveis que dados dois inteiros positivos x e y, devolva uma stream de todos os inteiros maiores do que 0 que sejam divisiveis por x ou por y. A stream retornada pelo procedimento deve deve disponibilizar os inteiros por ordem crescente. Caso entenda necessario poderá escrever procedimentos auxiliares.

exemplo

(divisiveis 2 3) -> ( 2 3 4 6 8 9 10 12 14 15.....)

(divisiveis 4 7) -> (4 7 8 12 14 16 20 21 24 28.........)

O scheme que tenho aqui instalado (MIT Scheme) não tem a função (mod _ _) por isso não pode testar este código. Mas deve de estar certo :) . (Acho que o DrScheme tem essa função).

O único problema é que não sei qual é o maior número que o programa pode processar, por isso coloquei 100.

(define divisiveis
  (lambda (x y)
    (divisiveis-aux x y 1)))


(define divisiveis-aux
  (lambda (x y n)
    (cond ((= n 100) ; arbitrario?                                                
           '())
          ((or (= (mod x n) 0)
               (= (mod y n) 0))
           (cons n (divisiveis-aux x y (+ n 1))))
          (else
           (divisiveis-aux x y (+ n 1))))))


Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos. Prontos, a minha pessoa está oficialmente protegida legalmente :D

Share this post


Link to post
Share on other sites
Marisacruz

O scheme que tenho aqui instalado (MIT Scheme) não tem a função (mod _ _) por isso não pode testar este código. Mas deve de estar certo :) . (Acho que o DrScheme tem essa função).

O único problema é que não sei qual é o maior número que o programa pode processar, por isso coloquei 100.

(define divisiveis
  (lambda (x y)
    (divisiveis-aux x y 1)))


(define divisiveis-aux
  (lambda (x y n)
    (cond ((= n 100) ; arbitrario?                                                
           '())
          ((or (= (mod x n) 0)
               (= (mod y n) 0))
           (cons n (divisiveis-aux x y (+ n 1))))
          (else
           (divisiveis-aux x y (+ n 1))))))

Ola, ao testar o mod da erro. Nos em scheme geralmente não  utilisamos mod, mas de qualquer forma obrigada pela atenção e pela disponibilidade.

escrevi este procedimento mas também da-me erro ao testar, e não consigo corrigir o erro

(define (divisiveis x y)

    (> (remainder  divisiveis x y ) 0))

(define (stream-filter-aux divisiveis x y)

  (stream-filter-aux (inteiros divisiveis x y)))

Share this post


Link to post
Share on other sites
rolando2424

De acordo com a wikipedia, os operadores do scheme para o resto da divisão inteira são o modulo e o remainder.

Obrigado, já lá vai algum tempo desde que programei Scheme.

Em vez de 100, calcula o máximo entre x e y e divide por dois.

Não percebi.

O número máximo de números divisíveis por um número é infinito.

Por exemplo:

(divisiveis 2 3) -> ( 2 3 4 6 8 9 10 12 14 15.....)

A lista de retorno vai incluir todos os números pares existentes.

A não ser que o DrScheme tenha implementações lazy de listas ou algo assim. (EDIT: Pelos vistos... até tem. Mas não sei se a Marisacruz terá dado isso, por isso vou deixar ficar o limite de 100)

O código a funcionar é este:

(define divisiveis
  (lambda (x y)
    (divisiveis-aux x y 1)))

(define divisiveis-aux
  (lambda (x y n)
    (cond ((= n 100) ; arbitrario?                                                
           '())
          ((or (= (modulo n x) 0) ; Tinha aqui a ordem dos argumentos ao contrário (tinha (modulo x n) em vez de (modulo n x)) 
               (= (modulo n y) 0))
           (cons n (divisiveis-aux x y (+ n 1))))
          (else
           (divisiveis-aux x y (+ n 1))))))

Ola, ao testar o mod da erro. Nos em scheme geralmente não  utilisamos mod, mas de qualquer forma obrigada pela atenção e pela disponibilidade.

escrevi este procedimento mas também da-me erro ao testar, e não consigo corrigir o erro

(define (divisiveis x y)

    (> (remainder  divisiveis x y ) 0))

(define (stream-filter-aux divisiveis x y)

  (stream-filter-aux (inteiros divisiveis x y)))

Se percebi bem o que estás a tentar fazer no divisiveis, tens o sinal ao contrário (devia de ser < e não >) e nesse caso o 0 devia de vir primeiro.

Exemplo:

1 ]=> (< 2 3 4 6 8 9 10 12 14 15)
;Value: #t

1 ]=> (< 2 3 4 6 8 9 10 12 14 15 0)
;Value: #f

1 ]=> (< 0 2 3 4 6 8 9 10 12 14 15)
;Value: #t

Por isso o define devia de ser:

(define (divisiveis x y)
     (< 0 (remainder divisiveis x y)))

Isto assumindo que a instrução remainder estaria correcta, o que não está.

Documentação do remainder:

(remainder n m) → integer?

  n : integer?

  m : integer?

Ou seja, a função remainder só recebe 2 argumentos e têm que ser inteiros. No teu código estás a tentar chamar remainder com 3 argumentos, um dos quais é uma função.

Em relação à função stream-filter-aux, não estou a perceber muito bem o que estás a tentar fazer.

Primeiro definiste stream-filter-aux como recebendo 3 argumentos com os nomes divisiveis, x e y e depois chama-a com um só argumento, que é o resultado da função (inteiros divisiveis x y), que não está definida em nenhum lado.


Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos. Prontos, a minha pessoa está oficialmente protegida legalmente :D

Share this post


Link to post
Share on other sites
Rui Carlos

Esquece, não tinha lido o problema com atenção. Pensa que pedia os divisores.

Neste caso, assumo que o objectivo seja devolver uma lista infinita (em Haskell tal não é problemático, não sei como é que funciona em Scheme).

Share this post


Link to post
Share on other sites
rolando2424

Esquece, não tinha lido o problema com atenção. Pensa que pedia os divisores.

Neste caso, assumo que o objectivo seja devolver uma lista infinita (em Haskell tal não é problemático, não sei como é que funciona em Scheme).

Pelo vistos em scheme é possível usar lazy lists (link), mas como os exercícios parecem-me simples não penso que tenha sido dada esse tipo de programação.

Se for para usar lazy evaluation então não posso ajudar muito porque nunca estudei isso em Scheme, o pouco que sei foi de andar a brincar um pouco com Haskell.

EDIT: Uma resolução possível para a parte do o binário:

(define (binario base)
  (if (even? base)
    (binario-aux base #f 1)
    '()))

(define (binario-aux base is-top n)
  (cond ((= n 100) ; arbitrario?
          '())
    (is-top ; pode ser trocado por (boolean=? is-top #t)
      (cons (+ base 1) (binario-aux base #f (+ n 1))))
    (else
      (cons base (binario-aux base #t (+ n 1)))))))

EDIT 2: Com uma ajuda do manual:

Função binario usando lazy evaluation:

(define head car)

(define (tail stream)
  (force (cdr stream)))

(define (binario base)
  (if (even? base)
    (binario-aux base #f)
    '()))

(define (binario-aux base is-top)
  (if (boolean=? is-top #t)
      (cons (+ base 1) (delay (binario-aux base #f)))
      (cons base (delay (binario-aux base #t)))))

Exemplo de utilização:

1 ]=> (head (binario 0))
;Value: 0

1 ]=> (head (tail (binario 0)))
;Value: 1

1 ]=> (head (tail (tail (binario 0))))
;Value: 0

1 ]=> (head (tail (tail (tail (binario 0)))))
;Value: 1

Não sei se o scheme tem funções estilo (take-n n stream) que devolva os primeiros n elementos de um stream.

Deve ser possível converter o divisiveis-aux para usar lazy evaluation de uma forma semelhante.

EDIT 3: Não tem o take-n, mas é fácil de o criar:

(define (take-n n list)
  (if (<= n 0) ; Protege contra valores de n negativo
    '()
    (cons (head list)
      (take-n (- n 1) (tail list)))))

Exemplo de uso:

1 ]=> (take-n 1 (binario 0))
;Value 25: (0)

1 ]=> (take-n 100 (binario 0))
;Value 26: (0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1)


Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos. Prontos, a minha pessoa está oficialmente protegida legalmente :D

Share this post


Link to post
Share on other sites
Marisacruz

Pelo vistos em scheme é possível usar lazy lists (link), mas como os exercícios parecem-me simples não penso que tenha sido dada esse tipo de programação.

Se for para usar lazy evaluation então não posso ajudar muito porque nunca estudei isso em Scheme, o pouco que sei foi de andar a brincar um pouco com Haskell.

EDIT: Uma resolução possível para a parte do o binário:

(define (binario base)
  (if (even? base)
    (binario-aux base #f 1)
    '()))

(define (binario-aux base is-top n)
  (cond ((= n 100) ; arbitrario?
          '())
    (is-top ; pode ser trocado por (boolean=? is-top #t)
      (cons (+ base 1) (binario-aux base #f (+ n 1))))
    (else
      (cons base (binario-aux base #t (+ n 1)))))))

EDIT 2: Com uma ajuda do manual:

Função binario usando lazy evaluation:

(define head car)

(define (tail stream)
  (force (cdr stream)))

(define (binario base)
  (if (even? base)
    (binario-aux base #f)
    '()))

(define (binario-aux base is-top)
  (if (boolean=? is-top #t)
      (cons (+ base 1) (delay (binario-aux base #f)))
      (cons base (delay (binario-aux base #t)))))

Exemplo de utilização:

1 ]=> (head (binario 0))
;Value: 0

1 ]=> (head (tail (binario 0)))
;Value: 1

1 ]=> (head (tail (tail (binario 0))))
;Value: 0

1 ]=> (head (tail (tail (tail (binario 0)))))
;Value: 1

Não sei se o scheme tem funções estilo (take-n n stream) que devolva os primeiros n elementos de um stream.

Deve ser possível converter o divisiveis-aux para usar lazy evaluation de uma forma semelhante.

EDIT 3: Não tem o take-n, mas é fácil de o criar:

(define (take-n n list)
  (if (<= n 0) ; Protege contra valores de n negativo
    '()
    (cons (head list)
      (take-n (- n 1) (tail list)))))

Exemplo de uso:

1 ]=> (take-n 1 (binario 0))
;Value 25: (0)

1 ]=> (take-n 100 (binario 0))
;Value 26: (0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1)

Pelo vistos em scheme é possível usar lazy lists (link), mas como os exercícios parecem-me simples não penso que tenha sido dada esse tipo de programação.

Se for para usar lazy evaluation então não posso ajudar muito porque nunca estudei isso em Scheme, o pouco que sei foi de andar a brincar um pouco com Haskell.

EDIT: Uma resolução possível para a parte do o binário:

(define (binario base)
  (if (even? base)
    (binario-aux base #f 1)
    '()))

(define (binario-aux base is-top n)
  (cond ((= n 100) ; arbitrario?
          '())
    (is-top ; pode ser trocado por (boolean=? is-top #t)
      (cons (+ base 1) (binario-aux base #f (+ n 1))))
    (else
      (cons base (binario-aux base #t (+ n 1)))))))

EDIT 2: Com uma ajuda do manual:

Função binario usando lazy evaluation:

(define head car)

(define (tail stream)
  (force (cdr stream)))

(define (binario base)
  (if (even? base)
    (binario-aux base #f)
    '()))

(define (binario-aux base is-top)
  (if (boolean=? is-top #t)
      (cons (+ base 1) (delay (binario-aux base #f)))
      (cons base (delay (binario-aux base #t)))))

Exemplo de utilização:

1 ]=> (head (binario 0))
;Value: 0

1 ]=> (head (tail (binario 0)))
;Value: 1

1 ]=> (head (tail (tail (binario 0))))
;Value: 0

1 ]=> (head (tail (tail (tail (binario 0)))))
;Value: 1

Não sei se o scheme tem funções estilo (take-n n stream) que devolva os primeiros n elementos de um stream.

Deve ser possível converter o divisiveis-aux para usar lazy evaluation de uma forma semelhante.

EDIT 3: Não tem o take-n, mas é fácil de o criar:

(define (take-n n list)
  (if (<= n 0) ; Protege contra valores de n negativo
    '()
    (cons (head list)
      (take-n (- n 1) (tail list)))))

Exemplo de uso:

1 ]=> (take-n 1 (binario 0))
;Value 25: (0)

1 ]=> (take-n 100 (binario 0))
;Value 26: (0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1)

Testei o código e funciona na perfeição. Muito obrigada pela ajuda

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.