O objetivo desta aula é experimentar a definição de funções que invocam outras funções, bem como a definição de funções recursivas. Esta aula tem também dois objetivos adicionais: experimentar a definição de procedimentos e o desenvolvimento de código com input e output com o utilizador. Após a realização da prática, deverá ter sido adquirida uma noção básica dos seguintes conceitos:
Desenvolva um módulo com funções que permitam:
Esta função deverá iterar sobre os números naturais até n, contando os números que são divisores de n. Exemplo:
number_of_divisors(8) → 4 (1, 2, 4, 8)
def number_of_divisors(n):
divisors = 0
i = 1
while i != n + 1:
if n % i == 0:
divisors = divisors + 1
i = i + 1
return divisors
Note que o conjunto dos divisores próprios exclui o próprio número.
Esta função deverá iterar sobre os números naturais até n (exclusive), acumulando os números que são divisores de n.\ Exemplo:
sum_of_divisors(6) → 6 (1 + 2 + 3)
def sum_of_divisors(n):
total = 0
i = 1
while i != n:
if n % i == 0:
total = total + i
i = i + 1
return total
Exemplo:
is_prime(6) → false
Nota: nesta função é útil invocar a função do exercício 1 do trabalho prévio, que calcula quantos divisores tem um número. A função pode ser invocada da seguinte forma:
n = number_of_divisors(8)
Após a instrução executar, a variável n tomará o valor devolvido pela invocação da função number_of_divisors().
def is_prime(n):
return number_of_divisors(n) == 2
is_prime(11)
Exemplo:
sum_of_primes_smaller_than(8) → 17 (2 + 3 + 5 + 7)
def sum_of_primes_smaller_than(n):
total = 0
i = 1
while i < n:
if is_prime(i):
total = total + i
i = i + 1
return total
sum_of_primes_smaller_than(8)
Exemplo:
number_of_primes_up_to(11) → 5 (2, 3, 5, 7, 11)
def number_of_primes_up_to(n):
total = 0
i = 1
while i <= n:
if is_prime(i):
total = total + 1
i = i + 1
return total
number_of_primes_up_to(11)
def factorial(n):
if n <= 1:
return 1
else:
return n*factorial(n - 1)
Desenvolva um módulo com funções e procedimentos que permitam:
Esta função deverá pedir ao utilizador para introduzir um número inteiro entre os limites dados. Caso o utilizador introduza um número inteiro fora desse intervalo, a função voltar a pedir ao utilizador para introduzir um número inteiro dentros dos limites dados. Exemplo:
value_between(1, 6) → 2 (o utilizador introduziu o valor 2)
def positive_int():
n = input("Introduza um inteiro positivo: ")
while n <= 0:
n = input('Introduza um inteiro positivo: ')
return n
Este procedimento deverá escrever no ecrã por ordem crescente todos os números inteiros entre os limites dados na invocação do procedimento. Exemplo:
print_ascending_between(1, 5)
1
2
3
4
5
def print_ascending_between(a,b):
i = a
while i <= b:
print(i)
i = i + 1
print_ascending_between(1,5)
print_tens_in_roman(6)
LX
Exemplo:
print_in_roman(66)
LXVI
Exemplo:
print_ascending_between_in_h(6, 18, 3)
6
9
12
15
Um número perfeito é tal que a soma dos seus divisores próprios é igual ao próprio número. Por exemplo, 6 é um número perfeito, dado que os seus divisores próprios são {3, 2, 1} e 3 + 2 + 1 = 6.
def is_perfect(n):
return sum_of_divisors(n) == n
Exemplo:
number_of_perfect_numbers_up_to(30) → 2 (6, 28)
def number_of_perfects_up_to(n):
perfects = 0
i = 1
while i != n + 1:
if is_perfect(i):
perfects = perfects + 1
i = i + 1
return perfects
Exemplo:
exists_prime_between(5, 9) → true (7 está no intervalo ]5, 9[)
def exists_prime_in(a, b):
i = a + 1
while i != b:
if is_prime(i):
return True
i = i + 1
return False
Exemplo:
larger_difference_between_primes(13) → 4 (a diferença entre 7 e 11)