You are on page 1of 14

1. Explique com suas prprias palavras o que recurso.

uma funo que chama a se prprio para encontrar determinado valor.



2. Escreva uma funo que faa a soma de dois inteiros a + b, de forma recursiva,
retornando um inteiro como resultado. Utilize o seguinte prottipo: int
soma(int,int);

#include <stdio.h>
#include <stdlib.h>

int soma(int a, int b)
{
if (b==0)
return a;
else return soma(a+1,b-1);
}

int main()
{
int a, b;
printf("Digite um valor para a: ");
scanf("%d", &a);
printf("Digite um valor para ser b: ");
scanf("%d", &b);
printf("%d + %d e %d", a, b, soma(a,b));
return 0;
}
3. Escreva uma funo que faa a subtrao de dois inteiros a - b, de forma recursiva,
retornando um inteiro como resultado. Utilize o seguinte prottipo: int
subtracao(int,int);

#include <stdio.h>
#include <stdlib.h>

int subtracao(int a, int b)
{
if (b==0)
return a;
else return subtracao(a-1,b-1);
}

int main()
{
int a, b;
printf("Digite um valor para a: ");
scanf("%d", &a);
printf("Digite um valor para ser b: ");
scanf("%d", &b);
printf("%d - %d = %d", a, b, subtracao(a,b));
return 0;
}
4. Escreva uma funo que faa a multiplicao de dois inteiros a x b, de forma
recursiva, retornando um inteiro como resultado. Utilize o seguinte prottipo: int
multiplicacao(int,int);

#include <stdio.h>
#include <stdlib.h>

int multiplicacao(int a, int b)
{
if (b==0)
return b;
else return (a+multiplicacao(a,b-1));
}

int main()
{
int a, b;
printf("Digite um valor para a: ");
scanf("%d", &a);
printf("Digite um valor para ser b: ");
scanf("%d", &b);
printf("%d * %d = %d", a, b, multiplicacao(a,b));
return 0;
}

5. Escreva uma funo que calcule o piso da diviso de dois inteiros

, de forma
recursiva, retornando um inteiro como resultado. Utilize o seguinte prottipo: int
divisao(int,int);

#include <stdio.h>
#include <stdlib.h>

int divisao(int a, int b)
{
int c;
if (a<b)
{
c=0;
}
else if (b==0)
{
printf("Divisao impossivel (retorna erro) \n");
}
else
{
c=1+divisao(a-b,b);
}
return c;
}

int main()
{
int a, b;
printf("Digite um valor para a: ");
scanf("%d", &a);
printf("Digite um valor para ser b: ");
scanf("%d", &b);
printf("%d / %d = %d", a, b, divisao(a,b));
return 0;
}

6. Escreva uma funo recursiva que retorne um inteiro representando o resto da
diviso de dois inteiros

. Utilize o seguinte prottipo: int resto(int,int);



#include <stdio.h>
#include <stdlib.h>

int resto(int a, int b)
{
if (a<b)
return a;
else
return resto(a-b,b);
}


int main()
{
int a,b;
printf("Digite um valor para a: ");
scanf("%d", &a);
printf("Digite um valor para b: ");
scanf("%d", &b);
printf("O resto da diviso entre %d e %d e %d", a, b, resto(a,b));
return 0;
}

7. Escreva uma funo recursiva que retorne o mximo divisor comum entre dois
inteiros. Utilize o seguinte prottipo: int mdc(int,int);

#include <stdio.h>
#include <stdlib.h>

int mdc(int a, int b)
{
if((a % b) == 0)
return b;
else
return mdc(b,a%b);
}

int main()
{
int a,b;
printf("Digite um valor para a: ");
scanf("%d", &a);
printf("Digite um valor para b: ");
scanf("%d", &b);
printf("O MDC entre %d e %d e: %d", a, b, mdc(a,b));
return 0;
}


8. Escreva uma funo recursiva que retorne o mximo elemento de um vetor. A
funo deve receber um vetor de inteiros e um inteiro representando o ndice do
ltimo elemento do respectivo vetor. Utilize o seguinte prottipo: int max(int[],int);

#include <stdio.h>
#include <stdlib.h>

int max(int a[], int b)
{
if (b == 1)
return a[0];
else
{
int x;
x = max(a, b-1);
if (x > a[b-1])
return x;
else
return a[b-1];
}
}

int main()
{
int a[6]={5,6,8,9,7,9};
int b=6;
printf("%d", max(a,b));
return 0;
}

9. Escreva uma funo recursiva que retorne o mnimo elemento de um vetor. A funo
deve receber um vetor de inteiros e um inteiro representando o ndice do ltimo
elemento do respectivo vetor. Utilize o seguinte prottipo: int min(int[],int);

#include <stdio.h>
#include <stdlib.h>

int min(int a[], int b)
{
if (b == 1)
return a[0];
else
{
int x;
x = min(a, b-1);
if (x < a[b-1])
return x;
else
return a[b-1];
}
}


int main()
{
int a[6]={5,6,8,9,7,9};
int b=6;
printf("%d", min(a,b));
return 0;
}

10. Escreva uma funo recursiva que retorne a mdia de um vetor. A funo deve
receber um vetor de nmeros reais e um inteiro representando o ndice do ltimo
elemento do respectivo vetor. Utilize o seguinte prottipo: float media (float [],int);

#include <stdio.h>
#include <stdlib.h>

float media(float a[], int b)
{
float x;
if (b == 1)
return (a[0]);
x = media(a,b-1);
return ((x*(b-1)+a[b-1])/b);
}

int main()
{
float a[]={6.5,7.3,7.5,6.7};
int b=4;
printf("%f", media(a,b));
return 0;
}

11. Escreva uma funo recursiva que retorne o fatorial de um nmero inteiro. Utilize o
seguinte prottipo: int fatorial(int);

#include <stdio.h>
#include <stdlib.h>

int fatorial(int n)
{ if(n==1)
return n;
return (n*fatorial(n-1));
}

int main()
{
int a;
printf("Digite um numero: ");
scanf("%d", &a);
printf("O fatorial de %d e %d", a, fatorial(a));
return 0;
}

12. Escreva uma funo recursiva que receba um inteiro n e calcule o seguinte somatrio

. Utilize o seguinte prottipo: int somatorio(int);



#include <stdio.h>
#include <stdlib.h>

int soma(int n)
{ if(n == 1)
return 1;
else
return ( n + soma(n-1) );
}

int main()
{
int n;
printf("Digite um valor: ");
scanf("%d", &n);
printf("O somatario de %d reduzindo uma unidade ate chegar em 1 e: %d",n, soma(n));
return 0;
}

13. Escreva uma funo recursiva que receba um inteiro n e calcule o

, ou seja, o
piso do logaritmo de n na base 2. Utilize o seguinte prottipo: int log2(int);

#include <stdio.h>
#include <stdlib.h>

int log2(int a)
{
if (a==1)
return 0;
return (1 + log2(a/2));
}

int main()
{
int n;
printf("Digite uma valor para calcular o logaritimo na base 2: ");
scanf("%d", &n);
printf("O log de %d na base 2 e: %d", n, log2(n));
return 0;
}

14. Escreva uma funo recursiva que faa a busca sequencial em um vetor. A funo
deve receber um vetor inteiro, um inteiro representando o ndice do ltimo
elemento desse vetor e um inteiro correspondente ao valor que deve ser localizado
no vetor. Se o elemento for encontrado a funo retorna 1, seno retorna 0. Utilize o
seguinte prottipo: int busca_sequencial (int [], int, int);

#include <stdio.h>
#include <stdlib.h>

int busca_sequencial(int a[],int b,int c)
{
if (b==0)
return 0;
else
{
if (a[b-1]==c)
return 1;
else busca_sequencial(a,b-1,c);
}
}

int main()
{
int a[]={2,6,7,10,26,36,38,58};
int b=8;
int c=26;
printf("%d", busca_sequencial(a,b,c));
return 0;
}

15. Escreva uma funo recursiva que faa a busca binria em um vetor. A funo deve
receber um vetor inteiro, um inteiro representando o ndice do ltimo elemento
desse vetor e um inteiro correspondente ao valor que deve ser localizado no vetor.
Se o elemento for encontrado a funo retorna 1, seno retorna 0. Utilize o seguinte
prottipo: int busca sequencial (int [], int, int);

#include <stdio.h>
#include <stdlib.h>

int busca_binario(int v[], int x, int n)
{
if (n<=0)
return 0;
else
{
int meio = n/2;
if (x<v[meio])
return busca_binario(v,x, meio);
else if (x>v[meio])
{
return busca_binario(&v[meio+1],x,n-1-meio);
}
else
return 1;
}
}
int main ()
{
int v[]={1,5,6,8,9};
int n=5;
int x;
printf("Digite um numero na sequencia {1,5,6,8,9}: ");
scanf("%d", &x);
printf("%d", busca_binario(v, x, n));
return 0;
}

---------
Com 4 variveis

int busca_binaria(int a[],int b,int c,int d)

{ if (c < b) return 0;

//int m= (b + c)/2;

if (d < a[((b + c)/2)])

return busca_binaria(a, b, ((b + c)/2)-1, d);

else if (d > a[((b + c)/2)])

return busca_binaria(a, ((b + c)/2)+1, c, d);

else if (d == a[((b + c)/2)]) return 1;
}

16. Escreva uma funo recursiva que ordene um vetor inteiro de forma no decrescente
utilizando o algoritmo quicksort. A funo deve receber um vetor inteiro, um inteiro
representando o ndice do primeiro elemento desse vetor e um inteiro
representando o ndice de seu ltimo elemento. A funo deve modificar o vetor
recebido, e portanto no ser necessrio retornar nenhum valor. Utilize o seguinte
prottipo: void quicksort(int [], int, int);

#include <stdio.h>
#include <stdlib.h>

void quicksort( int a[], int b, int c)
{
int x; // 1
if (b < c)
{ // 2
c = separa( a, b, c); // 3
quicksort( a, b, x-1); // 4
quicksort( a, x+1, c); // 5
}
}

17. Escreva uma funo recursiva para calcular (

), dado que (

) (

)
(


), (

) e (

) . Sua funo deve receber dois inteiros n e k, e deve


retornar um inteiro. Utilize o seguinte prottipo: int binomio(int, int);

#include <stdio.h>
#include <stdlib.h>

int binomio(int n, int k)
{
if(k>n)
return 0;
if((k==0)|| (k==n))
return 1;
return binomio(n-1, k) + binomio(n-1, k-1);
}
int main()
{
int n, k;
printf("Digite um valor para n: ");
scanf("%d", &n);
printf("Digite um valor para k: ");
scanf("%d", &k);
printf("%d",binomio(n,k));
return 0;
}
18. Escreva uma funo recursiva para calcular a soma dos dgitos de um inteiro positivo.
Por exemplo, a soma dos dgitos de 345 12. Sua funo recebe um inteiro e retorna
a respectiva soma, tambm no formato inteiro. Utilize o seguinte prottipo: int
digitos(int);

#include <stdio.h>
#include <stdlib.h>

int digito(int a)
{
int b,c;
b = a%10;
c = (a - b)/10;
if (c <= 0)
return a;
else
return b + digito(c);
}


int main()
{
int a;
printf("Digite um numero: ");
scanf("%d", &a);
printf("A soma dos digitos do numero %d e %d", a, digito(a));
return 0;
}

19. Escreva uma funo recursiva para determinar se os elementos de um vetor inteiro
formam um palndromo. Sua funo recebe um vetor inteiro e um inteiro
representando o ndice do ltimo elemento do referido vetor. Exemplo, v =[1; 20; 30;
20; 1] palndromo (retornar 1) e w = [20; 30; 31; 20] no (retornar 0). Utilize o
seguinte prottipo: int palindromo(int [], int);

#include <stdio.h>
#include <stdlib.h>

int palidromo(int a[], int b)
{
if (b<=1)
return 1;
if (a[0]==a[b-1])
return palidromo(a+1,b-2);
else
return 0;
}
int main()
{
int a[]={5,0,2,2,0,5};
int b=6;
printf("%d",palidromo(a,b));
return 0;
}
20. Escreva uma funo recursiva que resolva o problema Torres de Hanoi".
Inicialmente temos 5 discos de dimetro diferentes na estaca A. O problema consiste
em mover os cinco discos da estaca A para C, utilizando estaca B como auxiliar. As
regras so as seguintes:

#include <stdio.h>
#include <stdlib.h>

void hanoi(int n, char a, char b, char c)
{
/* mova n discos do pino a para o pino b usando
o pino c como intermediario */
if (n == 1)
printf("mova disco %d de %c para %c\n", n, a, b);
else
{
hanoi(n - 1, a, c, b); // H1
printf("mova disco %d de %c para %c\n", n, a, b);
hanoi(n - 1, c, b, a); // H2
}
}

int main(void)
{
int numDiscos;
printf("Didite a quantidade de discos no Pino A: ");
scanf("%d", &numDiscos);
hanoi(numDiscos, 'A', 'B', 'C');
return 0;
}


Apontadores

1. Explique com suas prprias palavras o que so apontadores.
So valores que esto alocados em outra rea da memria, sendo possvel ser acessado
atravs de seu endereo.

2. Explique o uso do operador &
Retorna o endereo do apontador.

3. Explique o uso do operador *
Quando * esta no lado direito, retorna o contedo do endereo apontado (um valor), quando
esta no lado esquerdo retorna o endereo da memria apontado.

4. O que os programas abaixo imprimem.
A)

#include <stdio.h>
int main ()
{
int x=5, y=3, z ;
int *p ;
p=&x ;
z=2*y+(*p)-x ;
printf(z=%d , z ) ;
return 0;
}

Resposta: 6, Como P recebi x, ento temos: z=2*3+(5)-5 = 6
B)
#include <stdio.h>
int main ()
{
int x[ ]={1 , 2 , 3 , 4 , 5};
int n=5, i ;
int *p ;
p=x ;
for (i=0; i<n ; i++)
{
printf(%d\n , *(p+i ) ) ;
}
return 0 ;
}
Resposta: Faz um loop com 5 posies (de 0 a 4), com valores de 1 a 5. Isto porque o
apontador direcionado para o ndice do vetor.
C)
#include <stdio.h>
int main ()
{
int x[]={1,2,3,4,5} ,y[]={6,7,8,9,10} ;
int n=5, i;
int *p ,*q ;
p=x ;
q=y ;
for(i=0; i<n ; i++)
printf("%d\n",*(p+i)+*(q+(n-1-i))) ;
return 0 ;
}

Resposta: retorna um loop com 5 posies, todas de valor 11. Isto ocorre devido ao fato que a
funo soma o primeiro valor do vetor de x, com o ltimo de y: ex.: 1+10=11. Isto ocorre at o
valor de n ser menor que 5 (de 0 a 4).

D)
#include <stdio.h>
int main()
{
int x[]={1,2,3,4,5};
int *y[5];
int n=5,i;
int **p;
p=y ;
for (i=0; i<n ; i++)
{
*(p+i)=&x[i];
}
for (i=0; i<n ; i++)
{
printf("%d\n",*(*(p+i)));
}
return 0;
}

Resposta: O programa executa 2 loops, o primeiro destina-se a informar o nmero do ndice
do vetor, enquanto o segundo informa o valor deste ndice, assim o programa imprime uma
sequncia de 5 ndices (de 0 a 4) com valores de 1 a 5.

E)
#include <stdio.h>
int maior (int x, int y)
{
if (x>y) return x;
else return y ;
}
int main ()
{
int a=6, b=8;
int (*f) ();
f=maior;
printf ("%d\n",f(a,b));
return 0 ;
}

Resposta: 8, o ponteiro f, remete a funo maior, que retorna o maior valor de duas variveis.


F)
#include <stdio.h>
int mensagem(char msg[])
{
printf ("%s \n",msg);
}
int main ()
{
char a[]="Hello World!";
int (*f) ();
f=mensagem;
f(a);
return 0;
}

Resposta: Hello World!. Isto porque o ponteiro f aponta para a funo mensagem que
corresponde a um vetor de caracteres, que foi atribudo o contedo Hello World!