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?
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
A
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
ricardomb20111 like
@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…
A
Andre_Dorea_Mendes1 like
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
P
pfk661 like
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.
P
pfk661 like
Em linguagem funcional usa reduce, pra reduzir sua lista, exemplo:
(reduce+[12345]);;=>15
P
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.
A
Andre_Dorea_Mendes
Acho que entendi mais ou menos o que quis dizer e cheguei a essa quase solução:
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.
P
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.