Introdução à Programação em Python

(3) Exercícios sobre programação imperativa

Carlos Caleiro, Jaime Ramos

Dep. Matemática, IST - 2016

(versão de 4 de Novembro de 2020)

Todas as funções devem definidas imperativamente e devem ser testadas para garantir que funcionam como é esperado. Cada exercício sobre listas pode (e deve) ser resolvido de várias maneiras:

  • percorrendo as posições da lista com uma variável de progresso e usando a função len para determinar a guarda do ciclo
  • utilizando variável de progresso em lista

1 - Funções com um ciclo

1. Defina a função soma_nat que recebe como argumento um número natural $n$ e devolve a soma de todos os números naturais até $n$.

In [3]:
soma_nat(5)
Out[3]:
15

2. Defina a função div que recebe como argumentos dois números naturais $m$ e $n$ e devolve o resultado da divisão inteira de $m$ por $n$. Neste exercício não pode recorrer às operações aritméticas de multiplicação, divisão e resto da divisão inteira.

In [5]:
div(7,2)
Out[5]:
3
In [6]:
div(3,4)
Out[6]:
0

3. Defina a função prim_alg que recebe como argumento um número natural e devolve o primeiro algarismo (o mais significativo) na representação decimal de $n$.

In [8]:
prim_alg(5629)
Out[8]:
5
In [9]:
prim_alg(7)
Out[9]:
7

4. Defina a função num_perf que recebe como argumento um número inteiro positivo e devolve True se esse número for um número perfeito e False em caso contrário. Recorde que um número perfeito é um número natural que é igual à soma de todos os seus divisores próprios, isto é, a soma de todos os divisores excluindo o próprio número.

In [2]:
num_perf(6)
Out[2]:
True
In [3]:
num_perf(5)
Out[3]:
False

5. Considere a função $f:\mathbb{N}\to\mathbb{N}$ tal que $$ f(x)=\begin{cases} x/2 & \textrm{se $x$ for um número par}\\ 3x+1 & \textrm{caso contrário} \end{cases} $$ Defina a função num_it que recebe como argumento um número natural $n$ e devolve o número de vezes que $f$ tem de ser aplicada (recursivamente) a $n$ até se atingir o número 1, i.e., devolve o número $k$ tal que $$ \underbrace{f(f(\dots f(n)))}_{k-\textrm{vezes}} =1. $$ A conjectura de Collatz afirma que tal programa termina sempre, facto de que não se conhece nenhuma prova ou contraexemplo.

In [7]:
num_it(5)
Out[7]:
5
In [8]:
num_it(21)
Out[8]:
7
In [10]:
num_it(27)
Out[10]:
111

6. Defina a função quadrados que recebe como argumento um número natural $n$ e devolve a lista dos $n$ primeiros quadrados perfeitos $n$.

In [12]:
quadrados(6)
Out[12]:
[1, 4, 9, 16, 25, 36]

7. Defina a função quadrados_inv que recebe como argumento um número natural $n$ e devolve a lista dos quadrados perfeitos até $n$, por ordem decrescente.

In [14]:
quadrados_inv(6)
Out[14]:
[36, 25, 16, 9, 4, 1]

8. Defina a função prod_lista que recebe como argumento uma lista de inteiros e devolve o produto dos seus elementos.

In [18]:
prod_lista([1,2,3,4,5,6])
Out[18]:
720

9. Defina a função contem_parQ que recebe como argumento uma lista de números inteiros $w$ e devolve True se $w$ contém um número par e False em caso contrário.

In [24]:
contem_parQ([2,3,1,2,3,4])
Out[24]:
True
In [25]:
contem_parQ([1,3,5,7])
Out[25]:
False
In [26]:
contem_parQ([])
Out[26]:
False

10. Defina a função todos_imparesQ que recebe como argumento uma lista de números inteiros $w$ e devolve True se $w$ contém apenas números ímpares e False em caso contrário.

In [29]:
todos_imparesQ([1,3,5,7])
Out[29]:
True
In [30]:
todos_imparesQ([])
Out[30]:
True
In [31]:
todos_imparesQ([1,2,3,4,5])
Out[31]:
False

11. Defina a função pertenceQ que recebe como argumentos uma lista de números inteiros $w$ e um número inteiro $n$ e devolve True se $n$ ocorre em $w$ e False em caso contrário.

In [34]:
pertenceQ([1,2,3],1)
Out[34]:
True
In [35]:
pertenceQ([1,2,3],2)
Out[35]:
True
In [36]:
pertenceQ([1,2,3],3)
Out[36]:
True
In [37]:
pertenceQ([1,2,3],4)
Out[37]:
False

12. Defina a função maior_dif que recebe como argumento duas listas não vazia de números inteiros $w1$ e $w2$, de igual comprimento, e devolve a diferença entre o maior número inteiro de $w1$ e o menor número inteiro de $w2$.

In [4]:
maior_dif([1,2,3],[4,5,6])
Out[4]:
-1
In [5]:
maior_dif([4,5,6],[1,2,3])
Out[5]:
5

13. Defina a função indices_impar que recebe como argumento uma lista de números inteiros $w$ e devolve a lista dos elementos de $w$ em posições de índice ímpar. Recorde que a primeira posição de uma lista tem índice 0, que é um número par.

In [65]:
indices_impar([0,1,2,3,4,5,6])
Out[65]:
[1, 3, 5]
In [66]:
indices_impar([0,1,2,3,4,5])
Out[66]:
[1, 3, 5]
In [67]:
indices_impar([])
Out[67]:
[]
In [68]:
indices_impar([1,2])
Out[68]:
[2]

14. Defina a função escolhe_pares que recebe como argumento uma lista de números inteiros $w$ e devolve a lista dos elementos pares de $w$.

In [72]:
escolhe_pares([1,2,3,4,4,2,6,8,9])
Out[72]:
[2, 4, 4, 2, 6, 8]
In [73]:
escolhe_pares([])
Out[73]:
[]
In [74]:
escolhe_pares([1,3,5,7,9])
Out[74]:
[]

15. Defina a função retira_negativos que recebe como argumento uma lista de números inteiros $w$ e devolve a lista resultante de retirar todos os números negativos de $w$.

In [76]:
retira_negativos([1,-2,-3,7,0])
Out[76]:
[1, 7, 0]

16. Defina a função supremo que recebe como argumento uma lista de números inteiros $w$ e devolve o supremo de $w$. Note que o supremo do conjunto vazio é $-\infty$. Para representar $\infty$ em Python pode recorrer à seguinte extensão:

In [77]:
from math import inf
In [79]:
supremo([1,2,3,-2,5,-7])
Out[79]:
5
In [80]:
supremo([])
Out[80]:
-inf
In [81]:
supremo([3,2,1])
Out[81]:
3

17. Defina a função posicoesMaximo que recebe como argumento uma lista de inteiros $w$ e devolve a lista das posiçoes onde ocorre maior elemento.

In [89]:
posicoesMaximo([1,2,3,2,1,2,3])
Out[89]:
[2, 6]
In [90]:
posicoesMaximo([])
Out[90]:
[]

18. Defina a função conta que recebe como argumentos uma lista de números inteiros $w$ e um número inteiro $k$ e devolve o número de vezes que $k$ ocorre em $w$.

In [94]:
conta([1,2,3,2,1,2],2)
Out[94]:
3
In [95]:
conta([1,2,3,2,1,2],4)
Out[95]:
0
In [96]:
conta([],5)
Out[96]:
0

19. Defina a função lposicoes que recebe como argumentos uma lista de números inteiros $w$ e um número inteiro $k$ e devolve a lista das posições em que $k$ ocorre em $w$.

In [104]:
lposicoes([1,2,3,4,2,2],2)
Out[104]:
[1, 4, 5]
In [105]:
lposicoes([1,2,3,4,2,2],7)
Out[105]:
[]
In [106]:
lposicoes([],3)
Out[106]:
[]

20. Defina a função car_pares que recebe como argumento uma lista de números inteiros $w$ e devolve uma lista com True nas posições onde ocorre em $w$ um número par e False nas outras.

In [108]:
car_par([2,3,4,3,2,2])
Out[108]:
[True, False, True, False, True, True]
In [109]:
car_par([3,3,3])
Out[109]:
[False, False, False]
In [110]:
car_par([])
Out[110]:
[]

21. Defina a função apaga1 que recebe como argumentos uma lista de números inteiros $w$ e um número inteiro $k$ e devolve a lista que resulta de apagar de $w$ a primeira ocorrência de $k$ (caso exista).

In [123]:
apaga1([1,2,3,4,3,2,1],3)
Out[123]:
[1, 2, 4, 3, 2, 1]
In [124]:
apaga1([1,2,3,4,3,2,1],1)
Out[124]:
[2, 3, 4, 3, 2, 1]
In [125]:
apaga1([1,2,3,4,3,2,1],5)
Out[125]:
[1, 2, 3, 4, 3, 2, 1]
In [12]:
apaga1([],3)
Out[12]:
[]

22. Defina a função apaga que recebe como argumentos uma lista de números inteiros $w$ e um número inteiro $k$ e devolve a lista que resulta de apagar de $w$ todas as ocorrências de $k$.

In [2]:
apaga([1,2,3,4,3,2,1],3)
Out[2]:
[1, 2, 4, 2, 1]
In [3]:
apaga([1,2,3,4,3,2,1],5)
Out[3]:
[1, 2, 3, 4, 3, 2, 1]
In [4]:
apaga([],3)
Out[4]:
[]

23. Defina a função seleccao que recebe como argumentos uma lista de números inteiros $w$ e um predicado e devolve a lista de todos os elementos de $w$ que verificam esse predicado.

In [19]:
seleccao([],primoQ)
Out[19]:
[]
In [20]:
seleccao([1,2,3,4,5,6,7,8,9,10],primoQ)
Out[20]:
[2, 3, 5, 7]

24. Defina a função mapeia que recebe como argumentos uma função $f$ e uma lista $w$ e devolve a lista que resulta de aplicar $f$ a cada um dos elementos de $w$.

In [25]:
def suc(x):
    return x+1
In [26]:
mapeia(suc,[0,1,2,3,4,5])
Out[26]:
[1, 2, 3, 4, 5, 6]
In [27]:
mapeia(suc,[])
Out[27]:
[]

25. Uma lista $s$ diz-se sufixo de uma lista $w$ se $s$ for um segmento do fim de $w$. Defina a função sufixoQ que recebe como argumentos duas listas $s$ e $w$ e devolve True se $s$ for sufixo de $w$ e False em caso contrário.

In [35]:
sufixoQ([3,4],[1,2,3,4])
Out[35]:
True
In [36]:
sufixoQ([3,4],[1,2,3,4,5])
Out[36]:
False
In [37]:
sufixoQ([1,2,3],[1,2])
Out[37]:
False
In [38]:
sufixoQ([],[1])
Out[38]:
True
In [39]:
sufixoQ([1,2,3],[1,2,3])
Out[39]:
True

26. Defina a função inverteLista que recebe como argumento uma lista $w$ e devolve a mesma lista mas invertida.

In [41]:
inverteLista([1,2,3,4,5])
Out[41]:
[5, 4, 3, 2, 1]
In [42]:
inverteLista([])
Out[42]:
[]

27. Defina a função lista_igualQ que recebe como argumentos duas listas e devolve True se as listas forem iguais e False em caso contrário. Não pode usar a comparação == entre listas.

In [56]:
lista_igualQ([1,2,3],[1,2,3])
Out[56]:
True
In [57]:
lista_igualQ([1,2,3],[1,2,2])
Out[57]:
False
In [58]:
lista_igualQ([],[])
Out[58]:
True
In [59]:
lista_igualQ((1,2,3),[1,2])
Out[59]:
False

28. Defina a função separaMult3e5 que recebe como argumento uma lista de números inteiros $w$ e devolve um par (uma lista) formado por duas listas: a dos múltiplos de 3 que ocorrem em $w$ e a dos múltiplos de 5 que ocorrem em $w$.

In [53]:
separaMult3e5([1,2,3,4,5,9,15])
Out[53]:
[[3, 9, 15], [5, 15]]
In [54]:
separaMult3e5([1,3,9,12,4,2])
Out[54]:
[[3, 9, 12], []]

Os exercícios seguintes são de um nível de dificuldade mais elevado. Caso considere necessário, utilize algumas das funções definidas anteriormente.

29. Defina a função permutacao que recebe como argumentos duas listas $w1$ e $w2$ e devolve True se $w1$ for uma permutação de $w2$ e False em caso contrário.

In [78]:
permutacao([1,2,3],[1,2,3])
Out[78]:
True
In [79]:
permutacao([1,2,3],[2,3,1])
Out[79]:
True
In [80]:
permutacao([1,1,1,2,3],[1,2,3])
Out[80]:
False
In [81]:
permutacao([1,2,3],[1,2,3,4])
Out[81]:
False

30. Defina a função intercala que recebe como argumentos duas listas $w1$ e $w2$ e devolve a lista resultante de intercalar os elementos de $w1$ com os de $w2$.

In [86]:
intercala([1,3,5],[2,4,6])
Out[86]:
[1, 2, 3, 4, 5, 6]
In [87]:
intercala([],[1,2,3])
Out[87]:
[1, 2, 3]
In [88]:
intercala([1,3,5],[2,4])
Out[88]:
[1, 2, 3, 4, 5]

31. Defina a função potencia que recebe como argumento um dígito $k$ (que não zero) e devolve o menor natural $n$ tal que $2^n$ começa por $k$.

In [92]:
potencia(2)
Out[92]:
1
In [93]:
potencia(3)
Out[93]:
5

2 - Funções com dois ciclos encaixados

1. Defina a função temPrimoQ que recebe como argumento uma lista de listas de números inteiros $w$ e devolve True se alguma das sublistas $w$ tem um número primo e False em caso contrário.

In [93]:
temPrimoQ([[1,4,6],[2],[8,8,8,8],[]])
Out[93]:
True
In [94]:
temPrimoQ([[1,2,6],[4],[8,8,8,8],[]])
Out[94]:
True
In [95]:
temPrimoQ([[4,4,4,4],[],[4,4,4,4]])
Out[95]:
False

2. Defina a função prodMatriz que recebe como argumento uma matriz de números e devolve o produto de todos os seus elementos.

In [22]:
prodMatriz([[1,2,3],[4,5,6]])
Out[22]:
720

3. Defina a função mediaColunasPares que recebe uma matriz e devolve a média dos elementos nas colunas de índice par da matriz.

In [45]:
mediaColunasPares([[1,2,3,4,5],[5,4,3,2,1],[0,2,4,6,5]])
Out[45]:
3.0
In [46]:
mediaColunasPares([[1,2,3,4],[4,3,2,1]])
Out[46]:
2.5

4. Defina a função indPrimos que recebe como argumento uma lista de listas de números inteiros $w=\{w_1,\dots,w_k\}$ e devolve a lista $r=\{r_1,\dots,r_n\}$, em que $r_i$ é uma lista composta pelos índices das posições dos números primos em $w_i$.

In [51]:
indPrimos([[1,2,3,4],[2,3,5,7,11],[],[4,6,8,9]])
Out[51]:
[[1, 2], [0, 1, 2, 3, 4], [], []]

5. Defina a função transposta que recebe como argumento uma matriz e devolve a sua trasposta.

In [61]:
transposta([[1,2,3],[4,5,6]])
Out[61]:
[[1, 4], [2, 5], [3, 6]]

6. Defina a função sup_listas1 que recebe como argumento uma lista de listas de números inteiros $w$ e devolve o supremo de $w$.

In [62]:
from math import inf
In [68]:
sup_listas1([])
Out[68]:
-inf
In [69]:
sup_listas1([[],[],[]])
Out[69]:
-inf
In [70]:
sup_listas1([[5,2,5],[3,8,1],[0]])
Out[70]:
8

7. Defina a função sup_listas2 que recebe como argumento uma lista de listas de números inteiros $w$ e devolve uma lista de comprimento igual a $w$ contendo em cada posição o supremo de cada uma das listas de $w$ na posição correspondente.

In [76]:
sup_listas2([])
Out[76]:
[]
In [77]:
sup_listas2([[],[],[]])
Out[77]:
[-inf, -inf, -inf]
In [78]:
sup_listas2([[5,2,5],[3,8,1],[0]])
Out[78]:
[5, 8, 0]

8. Defina a função repete que recebe como argumento uma lista $w$ e devolve uma lista em que o primeiro elemento de $w$ aparece repetido 1 vez, o segundo elemento aparece repetido duas vezes e assim sucessivamente.

In [80]:
repete([1,2,3])
Out[80]:
[1, 2, 2, 3, 3, 3]

9. Defina a função produtoMatrizes que recebe como argumento duas matrizes e devolve a sua matriz produto. Verifique que a dimensão das matrizes recebidas é tal que é possível realizar o seu produto (se tal não for possível, a função deve devolver mensagem de erro).

Sugestão: Pode, se assim o entender, definir uma função auxiliar para multiplicar a linha de uma matriz pela coluna da outra matriz.

In [84]:
produtoMatrizes([[1,2],[3,4]],[[1,2,3],[4,5,6]])
Out[84]:
[[9, 12, 15], [19, 26, 33]]

3 - Problemas

1. Considere o problema de calcular a área por baixo de um gráfico de uma função $f$ (o integral de $f$) num intervalo $[a,b]$.

Defina a função aproximaIntegral que recebe como argumentos uma função $f$, os extremos do intervalo de integração $a$ e $b$, e um parâmetro $n$ e calcula uma aproximação do integral de $f$ nesse intervalo.

A ideia consiste em dividir o intervalo $[a,b]$ em $n$-subintervalos consecutivos, com $n$ suficientemente grande para se obter a aproximação desejada:

$$ [a,b] = [x_0,x_1]\cup\dots\cup[x_{n-1},x_n] $$

e aproximar a função em cada um dos intervalos $[x_{i-1},x_i]$ por $f(x_{i-1})$.

Nestas condições, o valor do integral é aproximado por:

$$ \sum_{i=1}^{n} (x_i-x_{i-1}) f(x_{i-1}). $$

Escolhendo todos os intervalos com a mesma amplitude

$$ d = \frac{b-a}{n} $$

tem-se que $x_i = x_{i-1}+d$, ou então, que $x_i= a + i\times d$, e chega-se a $$ \sum_{i=1}^{n} d\times f(a+(i-1)\times d). $$

ou seja,

$$ d\times\sum_{i=1}^{n} f(a+(i-1)\times d). $$
In [89]:
def g(x):
    return (1+x)**(-1)
In [90]:
aproximaIntegral(g,0,1.5,5)
Out[90]:
1.0125276039749722
In [91]:
aproximaIntegral(g,0,1.5,500000)
Out[91]:
0.9162916318762734

2. Considere o problema de calcular a raíz de uma equação não linear num intervalo $[a,b]$ com aproximação de pelo menos $\epsilon$, usando o método da bissecção a seguir descrito. Defina a função bisseccao que recebe como argumento uma função $f$, os extremos do intervalos $a$ e $b$, e a aproximação $\epsilon$ e devolve a aproximação da solução da equação $f(x)=0$ no intervalo, caso exista.

O método da bissecção é um método iterativo para encontrar raízes de funções baseado no Teorema do Valor Intermédio. Pretende-se encontrar uma solução da equação $f(x)=0$, admitindo que $f$ é contínua em $[a,b]$ e que $f(a)f(b)<0$.

Tome-se $a_0=a$, $b_0=b$, $I_0=[a_0, b_0]$ e repita-se iterativamente o seguinte processo.

Seja $x_i$ o ponto médio do intervalo $I_i$. Uma das três condições seguintes verifica-se:

  1. $f(a_i)f(x_i)<0$, e existe uma raíz de $f$ em $[a_i,x_i]$;
  2. $f(a_i)f(x_i)>0$, e existe uma raíz de $f$ em $[x_i,b_i]$;
  3. $f(a_i)f(x_i)=0$, e $x_i$ é uma raíz de $f$.

No terceiro caso, não é preciso fazer mais nada. Para os outros dois casos, repete-se o processo considerando, no primeiro caso, $I_{i+1}=[a_i, x_i]$, e no segundo caso, $I_{i+1}=[x_i, b_i]$.

Aplicando este procedimento sucessivamente, é calculada uma sequência de intervalos $I_0\supset I_1\supset\ I_2\supset\dots$ onde a raíz $r\in I_k$ para todo o $k$. O procedimento termina quando a amplitude do intervalo for menor do que a aproximação pretendida $\epsilon$ e devolve o ponto médio desse intervalo. Note que a amplitude do intervalo se reduz a metade em cada iteração.

In [2]:
import numpy as np
In [3]:
def h(x):
    return x**2-np.e**x
In [4]:
bisseccao(h,-1,0,0.00001)
Out[4]:
-0.7034645080566406

4 - Exercícios de exame

1. Diz-se que uma lista tem elemento maioritário se mais de metade dos seus elementos forem iguais. Defina a função maioritario que recebe como argumento uma lista $w$ e devolve o elemento maioritário de $w$, caso exista, e o número de ocorrências desse elemento. No caso de a lista não ter elemento maioritário a função não devolve valor.

In [2]:
maioritario([3,2,3,3,3,1])
Out[2]:
(3, 4)
In [3]:
maioritario([1,2,3,2])
In [4]:
maioritario([4,4,4,3,5,4,5,6,4,4,3,4])
Out[4]:
(4, 7)
In [5]:
x,n=maioritario([4,4,4,3,5,4,5,6,4,4,3,4])
In [6]:
x
Out[6]:
4
In [7]:
n
Out[7]:
7

2. O reconhecimento de padrões consiste em verificar se uma determinada sequência padrão $p$ ocorre numa outra sequência $s$. Considere que, quer a sequência padrão $p$, quer a sequência $s$, são listas. Pretende-se verificar se os elementos da lista $p$ ocorrem na lista $s$, pela mesma ordem e consecutivamente. Apresentam-se em seguida alguns exemplos.

  • O padrão $[1,2,3]$ ocorre na sequência $[2,\textbf{1},\mathbf{2},\mathbf{3},4,5]$;
  • O padrão $[4,3,4]$ não ocorre na sequência $[2,1,4,2,3,4,5]$;
  • O padrão $[5,2,7]$ ocorre na sequência $[\textbf{5},\mathbf{2},\mathbf{7}]$;
  • O padrão $[9,4]$ ocorre na sequência $[3,2,4,2,\mathbf{9},\mathbf{4}]$;
  • O padrão $[7,4,3]$ ocorre na sequência $[7,4,\mathbf{7},\mathbf{4},\mathbf{3},7,2,7]$.

Defina uma função reconhece que recebe como argumento duas listas $p$ e $s$ e devolve True se o padrão $p$ ocorre na sequência $s$, e devolve False em caso contrário.

In [24]:
reconhece([1,2,3],[1,2,3,4,5])
Out[24]:
True
In [25]:
reconhece([4,3,4],[2,1,4,2,3,4,5])
Out[25]:
False
In [26]:
reconhece([5,2,7],[5,2,7])
Out[26]:
True
In [27]:
reconhece([9,4],[3,2,4,2,9,4])
Out[27]:
True
In [28]:
reconhece([7,4,3],[7,4,7,4,3,7,2,7])
Out[28]:
True

3. Defina a função e1 que recebe como argumento uma matriz quadrada de números inteiros e calcula a lista dos pares $[i,j]$ tais que a soma da linha $i$ é igual à soma da coluna $j$.

Sugestão: defina uma função auxiliar eqsum tal que eqsum(m,i,j) seja True no caso de a soma da linha i de m ser igual à soma da coluna j e False em caso contrário.

In [2]:
e1([[3, 4, 5], [5, 3, 2], [2, 3, 4]])
Out[2]:
[[1, 0], [1, 1]]

4. Defina a função e2 que recebe como argumento uma matriz de números inteiros e calcula a lista dos pares $[i,x]$ tais que a soma dos elementos da linha $i$ é igual a $x$.

In [4]:
e2([[3,4,5],[5,3,2],[2,3,4]])
Out[4]:
[[0, 12], [1, 10], [2, 9]]

5. Defina a função triangularSupQ que recebe como argumento uma matriz quadrada de números inteiros e determina se a matriz é triangular superior (isto é, todos os elementos abaixo da diagonal principal são nulos).

In [9]:
triangularSupQ([[1,2,3],[0,4,5],[0,0,6]])
Out[9]:
True
In [10]:
triangularSupQ([[1,0,0],[2,3,0],[4,5,6]])
Out[10]:
False

6. Defina a função e3 que recebe como argumento uma matriz quadrada de números inteiros e calcula o produto de todos os elementos pares acima da diagonal principal.

In [12]:
e3([[3, 4, 5], [5, 3, 2], [2, 3, 4]])
Out[12]:
8

7. Defina a função e4 que recebe como argumento uma matriz quadrada de números inteiros e calcula o produto de todos os elementos ímpares abaixo da diagonal principal.

In [14]:
e4([[3, 4, 5], [5, 3, 2], [2, 3, 4]])
Out[14]:
15

8. Defina imperativamente em Python uma função particaoQ que dada uma lista de números $w$ devolve True se existe $I\subseteq\{0,\dots,\tt{len}(w)\}$ tal que $\sum_{i\in I} w[i]$ é igual a $\sum_{i\notin I} w[i]$, e False em caso contrário.

Nomeadamente, particaoQ([1,2,3,3,1]) deverá ser True (pois 2+3 é igual 1+3+1), mas particaoQ([1,2,4]) deverá ser False.

Neste exercício não pode usar definições por compreensão nem métodos. As únicas operações sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]), cálculo do comprimento (len) e concatenação (+). Pode usar range.

9. Defina imperativamente em Python uma função quants que dada uma lista $w$ de números positivos e um número alvo $k$ não negativo devolve a lista de todas as listas de quantidades naturais $[q_0,\dots,q_{\tt{len}(w)-1}]$ tais que $$ \sum_{i=0}^{\tt{len}(w)-1} (q_i\ast w[i]==k). $$ Nomeadamente, quants([1,2,5],6) deverá ser [[6,0,0], [0,3,0], [2,2,0], [4,1,0], [1,0,1]].

Neste exercício não pode usar definições por compreensão nem métodos. As únicas operações sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]), cálculo do comprimento (len) e concatenação (+). Pode usar range.

10. Sabe-se que para todo o número inteiro positivo $n$ existem inteiros não-negativos $i,j,k$ que são palíndromos (na habitual notação decimal) tais que $n=i+j+k$. Por exemplo, tem-se $31415926=31400413+15251+262$.

Defina imperativamente em $Python$ uma função threepals que dado um número inteiro positivo n devolva um triplo de palíndromos (i,j,k) cuja soma seja n. Pode usar, sem a definir, uma função auxiliar palQ que dado um número natural devolve True se se tratar de um palíndromo, e False caso contrário.

11. Pelo teorema fundamental da aritmética, todo o número inteiro positivo tem uma factorização única como produto de números primos.

Defina imperativamente em Python uma função factor que dado um inteiro positivo ${\tt n}$ devolva a factorização de ${\tt n}$ na forma de uma lista de pares ${\tt [(p}_{\tt 1}{\tt , e}_{\tt 1}\tt{), . . . , (p}_{\tt k}{\tt , e}_{\tt k}{\tt)]}$ onde cada ${\tt p}_{\tt i}$ é um número primo e cada ${\tt e}_{\tt i}$ é um inteiro positivo tais que ${\tt n}={\tt p}_{\tt 1}^{{\tt e}_{\tt 1}}\times\dots\times {\tt p}_{\tt k}^{{\tt e}_{\tt k}}$.

Por exemplo, factor(200) deverá ser [(2, 3), (5, 2)].

12. Suponha que a cada lista de números $w$ da forma $[a_0,a_1,\dots,a_n]$ se associa o polinómio $p_w(x)=a_0+a_1x+a_2x^2+\dots+a_n x^n$.

Defina imperativamente em Python uma função prod que dadas duas listas de números u e v devolve a lista r tal que $p_r(x)=p_u(x)\times p_v(x)$. Por exemplo, prod([3,1,1],[1,2]) deverá resultar na lista [3,7,3,2], já que se tem $(3+x+x^2)\times (1+2x)=3+7x+3x^2+2x^3$.

Neste exercício não pode usar definições por compreensão nem métodos. As únicas operações sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]), comparação com a lista vazia (==[]), cálculo do comprimento (len) e concatenação (+).