sábado, 3 de agosto de 2019

Exemplo 3 de algoritmo recursivo - "quebrando" o problema em dois, fazendo duas chamadas recursivas.

import java.lang.Exception;

class Produto3 {
    static Exception e = new Exception();

    static int prod (int a, int b) {
        System.out.println ("a="+a+" b="+b);
        int retVal=0;
        e = new Exception();
        e.printStackTrace();
        if (b==1) {
            return a;        
        }
        retVal=prod(a,b/2);
        e = new Exception();
        e.printStackTrace();
        retVal+=prod(a,b/2);
        if ((b%2)==1) {
            // b é impar
            retVal+=a;
        }
        System.out.println ("a="+a+" b="+b);
        e = new Exception();
        e.printStackTrace();
        return retVal;
    }
    
    public static void main (String[] args) {
        System.out.println (prod (35));
        System.out.println ("fim do main");
    }
}
Java2html

O aspecto mais relevante, neste momento da disciplina, é a sequência de invocações e retornos dos métodos. Neste exemplo particular é uma árvore binária.

Nesta solução, fazer duas invocações (chamadas) recursivas é uma possibilidade, idéia que pode ser notada como: prod(a,b)= prod (a,b/2) + prod (a,b/2) + ((b%2)==1)?a:0. Como notado em aula, esta solução é menos eficiente que a do exemplo 2. Através do cálculo da complexidade assintótica (assunto das próximas aulas) é possível mostrar que a função de complexidade de tempo desta solução pertence à mesma classe da função de complexidade da solução 1.

Exemplo 2 de algoritmo recursivo - "quebrando" o problema em dois.

import java.lang.Exception;

class Produto22 {
    static Exception e = new Exception();

    static int prod (int a, int b) {
        int retVal=0;
        if (b==1) {
            return a;        
        }
        retVal=2*prod(a,b/2);
        if ((b%2)==1) {
            // b é impar
            retVal+=a;
        }
        return retVal;
    }
    
    public static void main (String[] args) {
        System.out.println (prod (35));
        System.out.println ("fim do main");
    }
}
Java2html

O cálculo do produto pode ser feito "diminuindo o tamanho do problema de uma unidade" ié: prod(a,b) = a + prod (a, b-1), ou "diminuindo o tamanho do problema pela metade (e dobrando o valor)" ié: prod(a,b) = 2*prod(a,b/2) + ((b%2)==1)?a:0. O tempo de execução da primeira solução é proporcional ao valor de b, o da segunda é proporcional ao log de b na base 2.

Exemplo de recursão com impressão da pilha de execução

import java.lang.Exception;

class Produto1 {
    static Exception e = new Exception();

    static int prod (int a, int b) {
        System.out.println ("a="+a+" b="+b);
        int retVal=0;
        e = new Exception();
        e.printStackTrace();
        if (b==1) {
            return a;        
        }
        retVal= a + prod (a, b-1);
        System.out.println ("a="+a+" b="+b);
        e = new Exception();
        e.printStackTrace();
        return retVal;
    }
    
    public static void main (String[] args) {
        System.out.println (prod (35));
        System.out.println ("fim do main");
    }
}
Java2html

O objeto Exception e armazena uma representação da pilha de execução no momento em que é instanciado. Aproveito isso para imprimir a pilha de execução antes e depois de cada invocação (chamada) recursiva. Isto traz informação que permite "ver" a pilha de execução crescendo à medida em que as invocações são feitas e diminuindo à medida que as invocações retornam.

Exemplo de algoritmo recursivo: Cálculo de produto usando somas.

import java.lang.Exception;

class Produto11 {
    static Exception e = new Exception();

    static int prod (int a, int b) {
        int retVal=0;
        if (b==1) {
            return a;        
        }
        retVal= a + prod (a, b-1);
        return retVal;
    }
    
    public static void main (String[] args) {
        System.out.println (prod (35));
        System.out.println ("fim do main");
    }
}
Java2html

quinta-feira, 11 de abril de 2019

11.04

public class MyClass {
    public static void main(String args[]) {
        int x=10;
        int y=25;
        int z=x+y;

        System.out.println("Sum of x+y = " + z);
       
        int[] v={98, 356, 67, -99, 67, 1, 3, 150, 8, 75};
        imprime (v);
        troca(v,10);
        imprime (v);
        menor(v);
        imprime (v);
    }
    public static void imprime (int[] v) {
        for(int i=0;i<v.length;i++) {
            System.out.print (v[i] + " ");
        }
        System.out.println ();
    }
    public static void troca (int[] v, int t) {
        int temp;
        if (t<=v.length-2) {
            temp=v[t];
            v[t]=v[t+1];
            v[t+1]=temp;
        } else {
            System.out.println ("t maior que o máximo.");
        }
    }
    public static void menor (int[] v) {
        for(int i=v.length-2;i>=0;i--) {
            if (v[i+1]<v[i]) {
                troca(v,i);
            }
        }
    }

}

sexta-feira, 22 de março de 2019

aula 21.03.2019 3

public class MyClass {
    public static void main(String args[]) {
        int x=3;
        switch(x) {
            case 3: System.out.println ("mais que excelente");
                    for (int i=0; i<=10;i+=2) {
                        System.out.println (i);
                    }
                    break;
            case 0: System.out.println("média");
                    break;
            case 1: System.out.println ("aprovado");
                    break;
            case 2: System.out.println ("excelente!");
                    break;
            case 4: System.out.println ("terminou");
                    break;
            default: System.out.println ("qq outra coisa");
        }
        System.out.println ("aqui!!!");
    }
}

aula 21.03.2019 2

public class MyClass {
    public static void main(String args[]) {
        int x=10;
        int y=4;
        int z=x+y;
        if (z<10) {
            System.out.println("média");
        } else if (z<15) {
            System.out.println ("aprovado");
        } else if (z<18) {
            System.out.println ("excelente!");
        } else {
            System.out.println ("mais que excelente");
        }
        System.out.println ("terminou");
    }
}

aula 21.03.2019 1

public class MyClass {
    public static void main(String args[]) {
        int x=10;
        int y=4;
        int z=x+y;
        if (z<10) {
            System.out.println("média");
        } else {
            if (z<15) {
                System.out.println ("aprovado");
            } else {
                if (z<18) {
                    System.out.println ("excelente!");
                } else {
                    System.out.println ("mais que excelente");
                }
            }
        }
        System.out.println ("terminou");
    }
}