Anúncio

Collapse
No announcement yet.

para os "nerds" da programação

Collapse

Ads nos topicos Mobile

Collapse

Ads Nos topicos Desktop

Collapse
X
Collapse
Primeira Anterior Próxima Última
 
  • Filtrar
  • Tempo
  • Show
Clear All
new posts

    para os "nerds" da programação

    olaré

    epah, tenho um projecto para a cadeira de inteligencia artificial em Lisp, que basicamente consiste em criar um função que simplifique expressões algébricas eliminando os elementos neutros e assim....por exemplo recebendo,

    (((5+ 0)*1)^1)/1

    deve devolver apenas 5

    atenção que não é fazer o calculo, é apenas simplificar a expressão...

    agora, ignorando a linguagem em que vou ter que trabalhar, como é que poderei resolver este problema; qual a melhor forma de abordar; que tipo de progaramação usar?

    thks!

    #2
    Uma maneira, deixa cá pensar,

    era por exemplo, conseguires pegar na expressao como deve ser,

    p.e. usando essa

    ((((5+ 0)*1)^1)/1)^2

    e construias ao lado uma nova

    inicialmente com 5

    depois vias a operação seguinte: 5 + 0 = 5 ? então esquece o zero

    depois multiplicava por 1 = 5 ? então ignora o 1

    (...)

    ^2 = 25 != 5, acrescenta o ^2

    devolve 5^2

    Agora em List... (defun naosei (conta) (newconta))

    Comentário


      #3
      Originalmente Colocado por MrAnderson Ver Post
      Uma maneira, deixa cá pensar,

      era por exemplo, conseguires pegar na expressao como deve ser,

      p.e. usando essa

      ((((5+ 0)*1)^1)/1)^2

      e construias ao lado uma nova

      inicialmente com 5

      depois vias a operação seguinte: 5 + 0 = 5 ? então esquece o zero

      depois multiplicava por 1 = 5 ? então ignora o 1

      (...)

      ^2 = 25 != 5, acrescenta o ^2

      devolve 5^2

      Agora em List... (defun naosei (conta) (newconta))
      hmmm....parece uma boa ideia.:p

      mas como é que eu corro a expressão original?

      uso um while com "ifs" lá dentro?.....ou tens uma ideia melhor :p?

      Comentário


        #4
        Isso agora, uma maneira eficiente de fazeres isso é que não sei, alem que tenho o Lisp muito enferrujado e já nem me recordo de como aceder a campos de parâmetros, e dado a minha aversão natural a lisp/scheme nem vou fazer um esforço, só aquela notação prefixa

        tens de ter atenção ao pormenor de expressões dentro de expressões.


        ((((5+ 0)*1)^1)/(0 + 2))^2

        ou mesmo:

        ((((5+ 0)*1)^1)/(0 + 1 + 1))^2
        aquele 0 , o zero tem de desaparecer, desta maneira, tens mesmo de separar todas as expressões, analisares à parte, e só depois juntares.

        Boa sorte com isso

        Comentário


          #5
          Originalmente Colocado por MrAnderson Ver Post
          Isso agora, uma maneira eficiente de fazeres isso é que não sei, alem que tenho o Lisp muito enferrujado e já nem me recordo de como aceder a campos de parâmetros, e dado a minha aversão natural a lisp/scheme nem vou fazer um esforço, só aquela notação prefixa

          tens de ter atenção ao pormenor de expressões dentro de expressões.


          ((((5+ 0)*1)^1)/(0 + 2))^2

          ou mesmo:

          ((((5+ 0)*1)^1)/(0 + 1 + 1))^2
          aquele 0 , o zero tem de desaparecer, desta maneira, tens mesmo de separar todas as expressões, analisares à parte, e só depois juntares.

          Boa sorte com isso
          lol
          eu ate axo piado à notação prefixa....mas ao inicio é atrofiante

          a sorte é que ainda tenho um es para fazer isso...

          thanks!

          Comentário


            #6
            pah, se tens uma soma ou subtracção com o 0 é ignorar.

            se tens uma multiplicaçao ou divisao com o 1 é para ignorar...

            se tens um exponencial de 1 é para ignorar...

            Comentário


              #7
              e isto é muito facil de fazer, fazes um ciclo com estas 3 funções, onde verificas se o mais é conjugado com o 0, se o * é conjugado com o 1 e assim sucessivamente.

              Comentário


                #8
                Assim de repente, e se começares por analisar a função da direita para a esquerda, analisando o último elemento de cálculo.

                (((5+ 0)*1)^1)/1

                Tipo:

                /1 -->anula-se a divisão
                ^1 --> anula-se o elevado
                *1-->anula-se a multiplicação
                +0 --> anula-se a soma

                Não sei se será a melhor solução, mas assim de repente foi o que me lembrei.

                Comentário


                  #9
                  exactamente o que disse lol.

                  é a abordagem mais simples e mais suscinta.

                  Comentário


                    #10
                    Originalmente Colocado por Joao_ben Ver Post
                    e isto é muito facil de fazer, fazes um ciclo com estas 3 funções, onde verificas se o mais é conjugado com o 0, se o * é conjugado com o 1 e assim sucessivamente.
                    sim , mas como é que eu exprimo isso?

                    qq do genero:

                    while( a expressão não acaba)
                    if( ??????)


                    o que é que meto dentro do if, para que ele verfique que há uma soma com zero, ou uma multiplicação por 1, por exemplo?

                    isso é que eu não estou a ver como se faz

                    Comentário


                      #11
                      A expressão já existe ou é introduzida pelo utilizador?
                      Se já existe talvez por sistema de array e vectores , se for dada pelo utilizador surgeria talvez um scanf isto em c ;) alguma expressao que vá snifando os parametros de entrada. Se disse parvoice desculpaideme

                      Comentário


                        #12
                        Originalmente Colocado por NFS Ver Post
                        A expressão já existe ou é introduzida pelo utilizador?
                        Se já existe talvez por sistema de array e vectores , se for dada pelo utilizador surgeria talvez um scanf isto em c ;) alguma expressao que vá snifando os parametros de entrada. Se disse parvoice desculpaideme
                        a expressão é introduzida pelo utilizador

                        pois, a ideia é percorrer a expressão toda em busca de somas, divisões, multiplicações, etc, e ver se estas operações são realizadas com elementos neutros ( zeros ou 1s)...., e se for retirar estas expressões....

                        Comentário


                          #13
                          para veres como se faz, tenho de saber em que tipo de dados estao armazenadas as operaçoes que queres suprimir...

                          tipo, as contas para analise estao num array?

                          Comentário


                            #14
                            sendo introduzidas pelo utilizador, penso que sao armazenadas num array.

                            se assim é nada mais simples, comparas cada elemento do array com as operações e depois verificas se essas mesmo sao realizadas com elementos "neutros" para a operação em questao (o na soma, 1 na multiplicação.. etc), depois nesse array deixas so o que restou da operaçao.

                            tem em atenção que tens de ter um array dinamico

                            Comentário


                              #15
                              Antes disso é necessário implementar a separação da expressão em operações básicas para um array e depois seguir o raciocinio do Joao_Ben

                              Comentário


                                #16
                                Procura, para cada operação, qual o elemento neutro e o elemento absorvente (caso exista). Por exemplo, 0 é elemento absorvente na multiplicação ou como base numa potência. 0 como expoente é tb elemento absorvente (o resultado é 1). Podes até detectar erros como divisões por zero ou 0^0.

                                Fazes isto sempre em ciclo, guardando sempre a expressão tal como ela está no início do novo ciclo. Quando a expressão final for igual à inicial (o ciclo n produziu alteração) o ciclo termina.

                                Comentário

                                AD fim dos posts Desktop

                                Collapse

                                Ad Fim dos Posts Mobile

                                Collapse
                                Working...
                                X