Operando Lista em Scheme?

11 respostas
scheme
Andre_Dorea_Mendes
(define aux 0)
(define (countzero lis)
   (if (not (null? lis))
     (cond
       ((eq? 0 (car lis)) (+ aux 1))
       ((null? lis) aux)
       ((countzero (cdr lis)))
         )
       ) "Lista Vazia"   
     )

esse é o código que estou tentando fazer para um programa que deve retornar o numero de zeros em uma lista, mas não consigo fazer o programa entrar no if e executar a parte interna alguém poderia me ajudar?

11 Respostas

Dragoon

desculpas, mas, qual linguagem é isso?

Andre_Dorea_Mendes

Scheme

pfk66

Seu código não parece completo. A variável lis esta sendo usando mas você não a declarou em lugar nenhum.

De qualquer maneira, em Clojure, um Lisp mais moderno e que roda na JVM, o que você quer fazer ficaria assim:

(def lista [0 1 2 3 4 5 6 7 8 9 0])

A função frequencies retorna o numero de ocorrências de todos os numeros da lista, na forma de um map onde a chave é cada item da lista e o valor é o numero de vezes que ele aparece na lista.

(def map (frequencies lista))

Para obter o número de 0s na lista:

(get map 0) retorna 2

Andre_Dorea_Mendes

muito obrigado pfk, mas é um exercicio de faculdade, preciso fazer apesar ultilizando Scheme, ja tentei procurar em diversos lugares e n consigo achar algo q me dê uma dica de como proseguir por aqui, mas muito obrigado pela resposta

R

@Andre_Dorea_Mendes, minha dica pra vc é sempre pensar nos passos da lógica que vc deseja implementar, não se importe tanto com os detalhes da linguagem em um primeiro momento. Eu entendi sua lógica, vc basicamente quer ver a lista não é nula, se não for, vc percorre ela vendo se o elemento é 0, se for vc conta…quando chegar a null vc retorna o contador, certo ?

Acho que o problema aí é que pela sintaxe do scheme ( comandos de condição), vc não deveria usar if e cond juntos… olha alguns exemplos aqui: https://docs.racket-lang.org/reference/if.html

O cond parece não precisar de if…

Andre_Dorea_Mendes

muito obrigado, vc teria alguma ideia de como fazer a contagem dos zeros? já que scheme não tem variaveis, estou com uma certa dificulde em imaginar como contabilizar

pfk66

Eu não sei se scheme tem essa função, mas se não tiver, clojure é opensource, você pode ver o código da função em clojure e converter pra scheme.

pfk66

Em linguagem funcional usa reduce, pra reduzir sua lista, exemplo:

(reduce + [1 2 3 4 5])  ;;=> 15
pfk66

Mas tem que saber se vai fazer de maneira “imperativa” ou “funcional”. No caso de scheme, que é funcional, não há necessidade de if/cond, loops ou variáveis. O certo seria como falei, criar uma função que retorna um map com quantas vezes cada elemento ocorre na lista, e depois criar outra função que acessa o valor para o item 0 no map. Na verdade, a primeira pode até ser implementada pela biblioteca padrão da linguagem, por ser um problema genérico, como é o caso da função frequencies em Clojure.

ps: A lógica funcional essencialmente é retorna o número de ocorrências de todos os items e o usuário da função usa o retorno pra saber quantas vezes o item que ele está interessado apareceu. Desse modo, não há condição sendo feita em nenhum momento do processo e não há necessidade de reescrever a função no futuro se o usuário resolver contar outro número. :slight_smile:

Andre_Dorea_Mendes

Acho que entendi mais ou menos o que quis dizer e cheguei a essa quase solução:

(define (countzero lis)
  (cond
    ((null? lis) 0)
    ((= 0 (car lis)) 1 + (countzero (cdr lis)))
    (else countzero(cdr lis))
    )
)

só que agora ao invés de retornar a quantidade, estou retornando a lista sem o primeiro e o segundo elemento, apesar de que minha logica me parece certa.

pfk66

1- Você esqueceu um par de parentes na hora de incrementar sua soma, e inverteu a ordem dos operadores. Não está usando Paredit?

1 + (countzero (cdr lis)

(+ 1 (countzero (cdr lis))

2- Voce pode testar se é 0 usando a função zero?.

3- Você escreveu como um programador OO faria. O problema dessa solução, é que ela não serve pra outro número, apenas zeros. Um programador scheme faria uma função que soma o número de vezes que cada item aparece na lista e retornaria um map.

Criado 13 de março de 2017
Ultima resposta 19 de mar. de 2017
Respostas 11
Participantes 4