• Nenhum resultado encontrado

Recursão Lista de exercícios. Programação Orientada a Objetos Prof Marcio Delamaro ICMC/USP 1/45

N/A
N/A
Protected

Academic year: 2021

Share "Recursão Lista de exercícios. Programação Orientada a Objetos Prof Marcio Delamaro ICMC/USP 1/45"

Copied!
45
0
0

Texto

(1)

Recursão – Lista de exercícios

(2)

Solução lista de exercícios

Vamos tentar, antes de mais nada, estabelecer como seria a definição recursiva do problema

Depois usaremos na implementação

(3)

Exercício 3

3) Implemente uma função recursiva que, dados dois números inteiros x e n, calcula o valor de xn.

Caso base?

(4)

Exercício 3

3) Implemente uma função recursiva que, dados dois números inteiros x e n, calcula o valor de xn.

Caso base? x 0 = 1

Passo da recursão:

(5)

Exercício 3

3) Implemente uma função recursiva que, dados dois números inteiros x e n, calcula o valor de xn.

Caso base? x 0 = 1

Passo da recursão: x n = x * x n-1

(6)

Exercício 3

int pot(int b, int p) {

   if ( p == 0 ) return 1;

   return ( b * pot(b, p­1));

(7)

Exercício 7

7) Usando recursividade, calcule a soma de todos os valores de um array de reais.

Caso base?

(8)

Exercício 7

7) Usando recursividade, calcule a soma de todos os valores de um array de reais.

Caso base? Tamanho do array = 0. Soma é 0.

(9)

Exercício 7

7) Usando recursividade, calcule a soma de todos os valores de um array de reais.

Caso base? Tamanho do array = 0. Soma é 0.

Passo da recursão:

v

(10)

Exercício 7

7) Usando recursividade, calcule a soma de todos os valores de um array de reais.

Caso base? Tamanho do array = 0. Soma é 0.

Passo da recursão:

v

v[n-1] + soma do restante do array.

(11)

Exercício 7

int soma_a(int v[], int n) {

   if ( n == 0 ) return 0;

   return v[n­1] + soma(v, n­1);

}

(12)

Exercício 1

1) Dado um array de inteiros e o seu número de elementos, inverta a posição dos seus

elementos.

Caso base?

(13)

Exercício 1

1) Dado um array de inteiros e o seu número de elementos, inverta a posição dos seus elementos.

Caso base? Tamanho do array menor ou igual a 1

(14)

Exercício 1

1) Dado um array de inteiros e o seu número de elementos, inverta a posição dos seus elementos.

Caso base? Tamanho do array menor ou igual a 1

Passo da recursão:

(15)

Exercício 1

1) Dado um array de inteiros e o seu número de elementos, inverta a posição dos seus elementos.

Caso base? Tamanho do array menor ou igual a 1

Passo da recursão:

Troca 1o. e último elementos e inverte resto do array.

(16)

Exercício 1

void inverte(int v[], int esq, int dir) {

int t;

   if (esq >= dir) return;

   t = v[esq];

   v[esq] = v[dir];

   v[dir] = t;

   inverte(v, esq+1, dir ­ 1);

}

(17)

Exercício 9

9) Escreva uma função recursiva que determine quantas vezes um dígito K ocorre em um número natural N. Por exemplo, o dígito 2 ocorre 3 vezes em 762021192.

Caso base?

(18)

Exercício 9

9) Escreva uma função recursiva que determine quantas vezes um dígito K ocorre em um número natural N. Por exemplo, o dígito 2 ocorre 3 vezes em 762021192.

Caso base? Quando todos os digitos já foram

examinados, ou seja, N = 0

(19)

Exercício 9

9) Escreva uma função recursiva que determine quantas vezes um dígito K ocorre em um número natural N. Por exemplo, o dígito 2 ocorre 3 vezes em 762021192.

Caso base? Quando todos os digitos já foram examinados, ou seja, N = 0

Passo da recursão: n

4

n

3

n

2

n

1

n

0

(20)

Exercício 9

9) Escreva uma função recursiva que determine quantas vezes um dígito K ocorre em um número natural N. Por exemplo, o dígito 2 ocorre 3 vezes em 762021192.

Caso base? Quando todos os digitos já foram examinados, ou seja, N = 0

Passo da recursão: n

4

n

3

n

2

n

1

n

0

(0 ou 1) + número de ocorrências em N / 10 (n

4

n

3

n

2

n

1

)

(21)

Exercício 9

int conta_dig(int N, int K) {

   if ( N == 0 ) return 0;

   return conta_dig( N / 10 , K) + ( N % 10 == K );

}

(22)

Exercício 4

4) Um problema típico em ciência da computação consiste em converter um número da sua forma decimal para a

forma binária.

Caso base?

(23)

Exercício 4

4) Um problema típico em ciência da computação consiste em converter um número da sua forma decimal para a

forma binária.

Caso base? Quando o número já foi todo transformado em binário. Ou seja: x = 0

Passo da recursão:

(24)

Exercício 4

4) Um problema típico em ciência da computação consiste em converter um número da sua forma decimal para a

forma binária.

Caso base? Quando o número já foi todo transformado em binário. Ou seja: x = 0

Passo da recursão: Saber como x/2 é convertido. Depois,

adicionar um dígito (o ou 1) relativo a x.

(25)

Exercício 4

void print_bin(int x) {

   if ( x == 0 ) return;

   print_bin(x / 2);

   printf("%d", x % 2);

}

(26)

Exercício 4

void print_bin(int x) {

   if ( x == 0 ) return;

   print_bin(x / 2);

   printf("%d", x % 2);

}

void print_bin(int x) {

   if ( x == 0 )     {

     printf("0");

     return;

   }

   print_bin(x / 2);

   printf("%d", x % 2);

}

(27)

Exercício 5

5) O máximo divisor comum (MDC) de dois números inteiros x e y pode ser calculado usando-se uma definição recursiva:

MDC(x, y) = MDC(x − y, y), se x > y

MDC(x,y) = MDC(y,x)

MDC(x,x) = x

Caso base?

(28)

Exercício 5

5) O máximo divisor comum (MDC) de dois números inteiros x e y pode ser calculado usando-se uma definição recursiva:

MDC(x, y) = MDC(x − y, y), se x > y

MDC(x,y) = MDC(y,x)

MDC(x,x) = x

Caso base? x == y

(29)

Exercício 5

5) O máximo divisor comum (MDC) de dois

números inteiros x e y pode ser calculado usando- se uma definição recursiva:

MDC(x, y) = MDC(x − y, y), se x > y

MDC(x,y) = MDC(y,x)

MDC(x,x) = x

Caso base? x == y

Passo da recursão?

(30)

Exercício 5

5) O máximo divisor comum (MDC) de dois números inteiros x e y pode ser calculado usando-se uma

definição recursiva:

MDC(x, y) = MDC(x − y, y), se x > y

MDC(x,y) = MDC(y,x)

MDC(x,x) = x

Caso base? x == y

Passo da recursão? Os dois outros casos acima. O

problema é definido recursivamente.

(31)

Exercício 5

int mdc(int p, int q) {

   if ( p == q ) return p;

   if ( p < q ) return mdc(q, p);

   return mdc(p ­ q, q);

}

(32)

Exercício 6

6) Pode-se calcular o resto da divisão, MOD, de x por y, dois números inteiros positivos, usando-se a seguinte definição:

MOD(x,y) = MOD(x - y, y) se x > y

MOD(x,y) = x se x < y

MOD(x,y) = 0 se x = y

Caso base?

(33)

Exercício 6

6) Pode-se calcular o resto da divisão, MOD, de x por y, dois números inteiros positivos, usando-se a seguinte definição:

MOD(x,y) = MOD(x - y, y) se x > y

MOD(x,y) = x se x < y

MOD(x,y) = 0 se x = y

Caso base? São dois: x < y ou x = y

(34)

Exercício 6

6) Pode-se calcular o resto da divisão, MOD, de x por y, dois números inteiros positivos, usando-se a seguinte definição:

MOD(x,y) = MOD(x - y, y) se x > y

MOD(x,y) = x se x < y

MOD(x,y) = 0 se x = y

Caso base? São dois: x < y ou x = y

Passo da recursão:

(35)

Exercício 6

6) Pode-se calcular o resto da divisão, MOD, de x por y, dois números inteiros positivos, usando-se a seguinte definição:

MOD(x,y) = MOD(x - y, y) se x > y

MOD(x,y) = x se x < y

MOD(x,y) = 0 se x = y

Caso base? São dois: x < y ou x = y

Passo da recursão: MOD(x - y, y) se x > y

(36)

Exercício 2a

2) Escreva as funções recursivas que unem dois (arrays), sem elementos repetidos, classificadas considerando que as duas listas não têm elementos em comum

Caso base?

(37)

Exercício 2a

2) Escreva as funções recursivas que unem dois (arrays), sem elementos repetidos, classificadas considerando que as duas listas não têm elementos em comum

Caso base? Quando ambos os arrays têm tamanho 0

Passo da indução:

(38)

Exercício 2a

2) Escreva as funções recursivas que unem dois (arrays), sem elementos repetidos, classificadas considerando que as duas listas não têm elementos em comum

Caso base? Quando ambos os arrays têm tamanho 0

Passo da indução:

Menor deles

(39)

Exercício 2a

2) Escreva as funções recursivas que unem dois (arrays), sem elementos repetidos, classificadas considerando que as duas listas não têm elementos em comum

Caso base? Quando ambos os arrays têm tamanho 0

Passo da indução:

(40)

Exercício 2a

void merge(int v1[], int n1, 

       int v2[], int n2, int v3[])  {

    if ( n1 == 0 && n2 == 0 ) return;

    if (n1 == 0) {       v3[0] = v2[0];

      merge(v1, n1, ++v2, ­­n2, ++v3);

    }     else

    if (n2 == 0) {       v3[0] = v1[0];

      merge(++v1, ­­n1, v2, n2, ++v3);

    }     else

    if (v1[0] <= v2[0]) {       v3[0] = v1[0];

      merge(++v1, ­­n1, v2, n2, ++v3);

    }

    else {

      v3[0] = v2[0];

      merge(v1, n1, ++v2, ­­n2, ++v3);

    }  }

(41)

Exercício 2c

void merge(int v1[], int n1, 

       int v2[], int n2, int v3[])  {

    if ( n1 == 0 && n2 == 0 ) return;

    if (n1 == 0) {       v3[0] = v2[0];

      merge(v1, n1, ++v2, ­­n2, ++v3);

    }     else

    if (n2 == 0) {       v3[0] = v1[0];

      merge(++v1, ­­n1, v2, n2, ++v3);

    }     else

   if (v1[0] < v2[0]) {       v3[0] = v1[0];

      merge(++v1, ­­n1, v2, n2, ++v3);

    }     else

    if (v1[0] > v2[0]){

      v3[0] = v2[0];

      merge(v1, n1, ++v2, ­­n2, ++v3);

    }

    else {

      v3[0] = v2[0];

      merge(++v1,­­n1,++v2,­­n2, ++v3);

     }  }

(42)

Exercício 8

8) Escreva um algoritmo recursivo capaz de

gerar todos os elementos do conjunto potência dado um conjunto formado por letras.

Caso base?

(43)

Exercício 8

8) Escreva um algoritmo recursivo capaz de

gerar todos os elementos do conjunto potência dado um conjunto formado por letras.

Caso base? 2 {} = {}

Passo da recursão:

(44)

Exercício 8

8) Escreva um algoritmo recursivo capaz de

gerar todos os elementos do conjunto potência dado um conjunto formado por letras.

Caso base? 2 {} = {}

Passo da recursão:

2 {a,b,c} = 2 {b,c} U {a} x 2 {b,c}

(45)

Exercício 8

void potencia(char pref[],  char s[], char *p) {

int l; char aux[100];

    l = strlen(s);

    if ( l == 0 )   {

       if (strlen(pref) == 

0 )

      strcpy(p, "{}");

        else {

      strcat(p, " ");

      strcat(p, pref);

        }

        return;

    }

    potencia(pref, s+1, p);

    strcpy(aux, pref);

    l = strlen(aux);

    aux[l] = s[0];

    aux[l+1] = '\0';

    potencia(aux, s+1, p);

    return;

}

Referências

Documentos relacionados

Na programação orientada a objetos, temos funções agregadas aos dados em uma unidade chamada objeto, ou seja, os dados não estão separados das funções, mas

- Coleta da impressão digital, do dedo indicador da mão direita do beneficiário (padrão). - Se o beneficiário não possuir o dedo indicador da mão direita, cadastrar então o dedo

O LAVI vem sendo montado gradativamente, com recursos provenientes do FDA (Fundo de Desenvolvimento Acadêmico) e LABGRAD (Programa de Apoio aos Laboratórios de

No século XVII, a Inglaterra conheceu convulsões revolucionárias que culminaram com a execução de um rei (1649) e a deposição de outro (1688). Apesar das

Temos então que na música ouvimos um movimento que não é o de objetos nem de uma psique, mas o movimento puro de forças fluindo em mudanças de estado e dinâmica. Esta

Os corta-circuitos têm duas funções: Funciona como interruptor principal para fornecer electricidade ao consumidor e, corta o fornecimento para proteger o gerador quando existir

1) As redes de pequenas e médias empresas são geralmente criadas para fornecer um fórum direto de atividades e relações entre os seus membros, os quais permanecem

Trabalho de Conclusao de Curso de Medicina da da Faculdade de Ciências Humanas, Exatas e da Saúde do Piauí/Instituto de Educação Superior do Vale do Parnaíba