Exercícios da aula 05
Exercícios da aula 05¶
Exercício 1¶
O que o programa a seguir vai imprimir?
a = 1
b = 2
soma2(a,b)
e o programa
a = 1
b = 2
soma2(b, a)
def soma2(a,b):
print(a+2*b)
a = 1
b = 2
soma2(a,b)
a = 1
b = 2
soma2(b, a)
Existe uma diferença entre variáveis que são passadas como argumentos e os argumentos. A função soma2
tem dois argumentos a
e b
. No primeiro exemplo, a
assume o valor de a
(definindo fora da função) e b
assume o valor de b
(definido fora da função). E portanto a função imprime o valor de a + 2*2
que vale 5
.
Já no segundo exemplo o a
dentro da função assume o valor de b
de fora da função e o b
de dentro da função assume o valor de a
de fora da função.
O primeiro exempl equivale a soma2(1,2)
e o segundo exemplo a soma2(2,1)
Exercício 2¶
Escreva a função máximo
que retorna o maior de dois números
def máximo(a,b):
if a > b:
return a
else:
return b
máximo(1,2)
máximo(2,1)
máximo(1,1)
Exercício 3¶
Escreva a função múltiplo
que retorna True
se o primeiro argumento for um múltiplo do segundo
def múltiplo(a, b):
return a % b == 0 and a > 0
múltiplo(1,2)
múltiplo(0,2)
múltiplo(4,2)
múltiplo(5,2)
Exercício 4¶
Escreva a função área_quadrado
que recebe o lado de um quadrado e calcula a área.
def área_quadrado(L):
return L*L
área_quadrado(1)
área_quadrado(2)
área_quadrado(3.3)
Exercício 5¶
Escreve a função área_triângulo
que recebe a base e a altura de um triângulo e retorna a sua área
def área_triângulo(B,H):
return B*H/2
área_triângulo(1,1)
área_triângulo(1,2)
Exercício 6¶
Reescreve a função para pesquisar uma lista (pesquise
) acima de modo a que use os métodos de pesquisa em lista que vimos na última aula.
def pesquise(L, val):
return L.index(val)
pesquise([1,2,3,4], 3)
pesquise([1,2,3,4], 4)
pesquise([1,2,3,4], 5)
Exercício 7¶
Defina uma função recursive que calcule o maior divisor comum (MDC) entre dois números a e b em que a > b.
mdc(a,b) = a
se b==0
e se a > b
, mdc(a,b) = mdc(b, a % b)
def mdc(a,b):
if b==0:
return a
elif a > b:
return mdc(b, a % b)
else:
return mdc(a, b % a)
mdc(8,2)
mdc(2,8)
mdc(8,8)
mdc(1*2*3*4*5, 1*2*3*4)
Exercício 8¶
Usando a função mdc
do exercício anterior, defina uma função para calcular o mínimo múltiplo comum (MMC) entre dois números:
Lembre que $|a \times b|$ é escrito como abs(a * b)
em Python.
def mmc(a,b):
return abs(a*b) // (mdc(a,b))
mmc(4,5)
mmc(5,4)
mmc(5,5*4)
Exercício 9¶
Reescreva o programa para calcular a sequência de Fibonacci sem utilizar recursão.
Compare o desempenho com a função recursiva. Se você estiver usando o notebook do jupyter ou o ipython você pode usar a instrução %time como mostrado a seguir
def fibonacci_recursivo(n):
if n <= 1:
return n
else:
return fibonacci_recursivo(n-1) + fibonacci_recursivo(n-2)
def fibonacci(n):
if n <= 1:
return n
fib_n_menos_1 = 0
fib_n = 1
for i in range(2,n+1):
tmp = fib_n
fib_n = fib_n + fib_n_menos_1
fib_n_menos_1 = tmp
return fib_n
[fibonacci(i) for i in range(11)]
[fibonacci_recursivo(i) for i in range(11)]
Vamos medir o tempo:¶
%timeit fibonacci(2)
%timeit fibonacci(5)
%timeit fibonacci(10)
%timeit fibonacci(15)
%timeit fibonacci(20)
%timeit fibonacci(25)
%timeit fibonacci(30)
%timeit fibonacci(35)
%timeit fibonacci(40)
n1 = [2, 5,10,15,20,25,30,35] #,40]
t1 = [279e-9,399e-9, 607e-9, 817e-9, 1.06e-6, 1.3e-6, 1.53e-6, 1.78e-6] #, 1.99e-6]
from matplotlib import pyplot as plt
plt.plot(n1, t1, "o")
%timeit fibonacci_recursivo(2)
%timeit fibonacci_recursivo(5)
%timeit fibonacci_recursivo(10)
%timeit fibonacci_recursivo(15)
%timeit fibonacci_recursivo(20)
%timeit fibonacci_recursivo(25)
%timeit fibonacci_recursivo(30)
%timeit fibonacci_recursivo(35)
n2 = [2,5,10,15,20, 25, 30, 35]
t2 = [300e-9, 1.46e-6, 17.1e-6, 190e-6, 2.13e-3, 23.5e-3, 260e-3, 2.92]
plt.plot(n2, t2, "o")
plt.semilogy(n1, t1, "ro", label="Iteração")
plt.semilogy(n2, t2, "bs", label="Iteração")
fator_mult = [t2[i] / t1[i] for i in range(len(t1))]
plt.semilogy(n1, fator_mult, "ro")
Análise do custo¶
O custo de cálculo do número de Fibonacci aumenta linearmente conforme n aumenta.
Já a usando a definição recursiva, o custo aumenta de maneira considerável. No último gráfico, com eixo log em y, pode-se ver que o custo da função recursiva aumenta exponencialmente em relação à implementação usando iteração. Assim, dado um número n
, o custo computacional pode ser descrito assim:
- Algoritmo iterativo: $\mathcal{O}(n)$
- Algoritmo recursivo: $\mathcal{O}(n\cdot \exp n)$
Exercício 10¶
Na aula 03 implementamos o algoritmo de reordenação de listas bubble sort. Crie uma função bubble_sort
que reordena os elementos de uma lista de números em ordem crescente
def bubble_sort(L):
N = len(L)
for i in range(N):
trocou = False
for k in range(N-i-1):
if L[k] > L[k+1]: # Inverter a posição
trocou = True
tmp = L[k]
L[k] = L[k+1]
L[k+1] = tmp
if not trocou:
break
L = [23,4,5,2,3,6,2345,6,32,345,4]
bubble_sort(L)
L
Exercício 11¶
Mude o programa do exercício 10 de modo que tenha um segundo parâmetro comparador
que é uma função que compara dois elementos
def maior(a, b):
return a > b
def bubble_sort(L, comparador=maior)
# Corpo da função
Esse segundo parâmetro é o que compara os elementos da lista. Se esse parâmetros for a função maior
, a lista será reordenada em ordem crescente.
Qual seria a função passada para o parâmetro comparador
para que a lista fosse reordenada em ordem decrescente?
def maior(a,b):
return a > b
def menor(a,b):
return a < b
def bubble_sort(L, comparador=maior):
N = len(L)
for i in range(N):
trocou = False
for k in range(N-i-1):
if comparador(L[k],L[k+1]): # Inverter a posição
trocou = True
tmp = L[k]
L[k] = L[k+1]
L[k+1] = tmp
if not trocou:
break
L = [23,4,5,2,3,6,2345,6,32,345,4]
bubble_sort(L, maior)
L
L = [23,4,5,2,3,6,2345,6,32,345,4]
bubble_sort(L, menor)
L
Exercício 12¶
Escreva uma função mapa
que recebe como primeiro parâmetro uma função e segundo parâmetro uma lista e cria uma nova lista aplicando esta função em cada elemento da lista.
Exemplo:
python-repl
In [10]: def dobro(n):
...: return 2*n
...:
In [11]: mapa(dobro, [1,2,3])
Out[11]: [2, 4, 6]
def mapa(fun, L):
Lout = []
for e in L:
v = fun(e)
Lout.append(v)
return Lout
def dobro(n):
return 2*n
mapa(dobro, range(10))
mapa(lambda x: x**2, range(10))
mapa(lambda x: x^3, range(10))
Funções lamda¶
São funções pequenas de uma linha que são usadas para serem passadas como argumentos
Comentários
Comments powered by Disqus