Valdemar W. Setzer
www.ime.usp.br/~vwsetzer
(na seção Recursos
Educacionais)
Versão 3.5 - 26/1/18
Os programas abaixo foram testados no ambiente Jupyter do Microsoft Azure. As palavras reservadas estão em negrito. Ver as tabelas de operadores, funções e comandos, com exemplos.
Os exemplos são progressivos, isto é, na especificação do que cada um exemplifica não é mencionado o que já foi exemplificado anteriormente.
Ver também o site
http://exercism.io/languages/python/exercises
com muitos exemplos; para os códigos, abrir as abas "Test Suite".
Este item dá exemplos do seguinte: comandos de atribuição, while e print, expressões condicionais e concatenação de cadeias de caracteres (strings), bem como a ativação do módulo de matemática real, e a raiz quadrada (math.sqrt):
import math # Ativa o módulo de funções matemáticas
""" Gera a sequência de Fibonacci até ultrapassar
um limite
que deve ser menor do que 1000, para alinhar os resultados
e razão entre cada dois elementos """
# O limite deve ser maior ou igual a 2
Limite=int(input('Entre com o limite (>= 2): '))
N=2 # Número de ordem de cada elemento da sequência
FibA = 1
FibB = 1
# Imprime os títulos da tabela
print(' N Fib(N) Razão')
# Imprime os dois primeiros
print ('001 001')
print ('002 001 1.0')
while FibB < Limite:
Aux = FibA + FibB # Cada novo elemento será a soma dos
dois anteriores
FibA=FibB # O segundo elemento torna-se o primeiro
FibB=Aux # O segundo elemento recebe a soma dos dois anteriores
N=N+1 # Número de ordem do próximo
elemento
# Concatena 00 à esquerda se Fib(N) for menor do que 10
# e um 0 se for maior do que 9 e menor do que 100
print('00'+str(N) if N<10 else '0'+str(N) if
N<100 else N,
' ', '00'+str(FibB) if
FibB<10 else
'0'+str(FibB) if FibB<100 else
FibB,' ', FibB/FibA)
print('Compare com a razão áurea:\n',' ',(1+math.sqrt(5))/2)
Dando-se 200 como entrada para N, o resultado que apareceu foi (o espaçamento foi ajustado para o tipo de caractere sendo usado aqui):
Entre com o limite (>= 2): 200
N Fib(N) Razão
001 001
002 001 1.0
003 002 2.0
004 003 1.5
005 005 1.6666666666666667
006 008 1.6
007 013 1.625
008 021 1.6153846153846154
009 034 1.619047619047619
010 055 1.6176470588235294
011 089 1.6181818181818182
012 144 1.6179775280898876
013 233 1.6180555555555556
Compare com a razão áurea:
1.618033988749895
Este exemplo tem dupla finalidade: 1. Exemplificar como se declara uma função recursiva, isto é, uma função que, em seu corpo, ativa ela própria. 2. Mostrar como funções recursivas podem ser usadas para implementar diretamente uma definição matemática indutiva.
""" Esta funççao recursiva
implementa diretamente
a definição indutiva da soma dos inteiros
de 1 até N:
a) A soma dos inteiros positivos até 1 é
1;
b) a soma dos inteiros positivos de 1 até N
é
a soma de N com a soma dos inteiros
positivos até N-1"""
def Soma1aN(N):
if N==1: return(1)
else: return (N+Soma1aN(N-1)) # note-se a ativação recursiva
# Uso da função
N=int(input('Entre com o valor de N: '))
print('A soma de 1 a', N, 'é', Soma1aN(N))
Resultados da execução:
Entre com o valor de N: 5
A soma de 1 a 5 é 15
Entre com o valor de N: 10
A soma de 1 a 10 é 55
""" FIBONACCI USANDO A FUNÇÃO RECURSIVA FibRec """
""" Gera os primeiros N números
da sequência de Fibonacci
e calcula a razão entre cada 2 consecutivos.
A partir do 26º haverá problema de alinhamento
vertical
dos resultados."""
"""Esta função calcula
o n-ésimo elemento da sequência de Fibonacci
a partir da definição indutiva: F(1)=1, F(2)=1,
F(N)=F(N-1)+F(N-2)
(a partir do 3o., cada elemento é a soma dos dois anteriores)
"""
import math # Ativa o módulo de funções
matemáticas
def FibRec(N): # Dá o valor do N-ésimo
elemento do sequência
if N==1: return(1)
if N==2: return(1)
else: return (FibRec(N-1)+FibRec(N-2))
# Programa que usa a função FibRec para gerar a sequência
# O limite deve ser maior ou igual a 2
Limite=int(input('Entre com o número de elementos (>=2): '))
N=2 # Número de cada elemento da sequência
# Imprime os títulos da tabela
print(' N Fib(N) Razão')
print(' ', '1', 3*' ', '1')
print(' ', '2', 3*' ', '1',3*' ', '1.0')
FibA = 1
FibB = 1
while N < Limite:
FibA=FibRec(N)
N=N+1
FibB=FibRec(N)
""" Concatena 3 brancos à
esquerda se Fib(N) for menor do que 10,
2 se for maior do que
9 e menor do que 100,
1 se for maior do que
99 e menor do que 1000.
Se for maior do que
1000 haverá problema de alinhamento """
print(2*' '+str(N) if N<10 else ' '+str(N)
if N<100 else N,
4*' '+str(FibB) if FibB<10 else
3*' '+str(FibB) if FibB<100 else
2*' '+str(FibB) if FibB<1000 else
' '+str(FibB) if FibB<10000 else FibB,
3*' ', FibB/FibA)
print('Compare com a razão áurea:\n', 12*' ',(1+math.sqrt(5))/2)
Resultado (o número de espaços em branco será diferente):
Entre com o número de elementos (>=2):
20
N Fib(N) Razão
1 1
2 1 1.0
3 2 2.0
4 3 1.5
5 5 1.6666666666666667
6 8 1.6
7 13 1.625
8 21 1.6153846153846154
9 34 1.619047619047619
10 55 1.6176470588235294
11 89 1.6181818181818182
12 144 1.6179775280898876
13 233 1.6180555555555556
14 377 1.6180257510729614
15 610 1.6180371352785146
16 987 1.618032786885246
17 1597 1.618034447821682
18 2584 1.6180338134001253
19 4181 1.618034055727554
20 6765 1.6180339631667064
Compare com a razão áurea:
1.618033988749895
Este programa ilustra o uso dos comandos elif, for e break.
# GERA A SEQUÊNCIA DE FIBONACCI OU A GENERALIZADA
USANDO A REGRA DE FIBONACCI
import math # Ativa o módulo de funções matemáticas
""" Usa a regra de Fibonacci (cada elemento é a soma
dos dois anteriores)
para gerar uma sequência de N números de Fibonacci
ou de números positivos
ou negativos (um dos dois iniciais deve ser diferente de
zero) e a razão entre cada dois
elementos consecutivos; estes ultrapassarem 999 haverá
perda do alinhamento dos resultados."""
print('Deseja a sequência de Fibonacci (F) ou uma qualquer (Q)?')
Resposta='X'
# Verifica se a resposta foi F ou Q, senão insiste
while
Resposta != 'F' and Resposta != 'Q':
Resposta=input('Digite F ou Q: ')
if Resposta == 'F':
FibA = 1
FibB = 1
elif Resposta == 'Q':
while True:
FibA = int(input('Entre com
o primeiro número: '))
FibB = int(input('Entre com
o segundo número: '))
if FibA == 0 and
FibB == 0:
print('Um deles deve
ser diferente de zero!')
else: break
while True:
Ult=int(input('Entre com o número de elementos: '))
if Ult <=1:
print('O número de elementos deve ser
>= 2!')
else: break
# Imprime os títulos da tabela
if Resposta == 'F':
print(' N Fib(N) Razão')
else: print(' N Qquer(N) Razão')
# Imprime os dois primeiros elementos
if Resposta == 'F':
print ('001 001')
print ('002 001 1.0')
else: # Resposta foi Q
# Imprime os dois primeiros elementos
if Resposta == 'F':
print ('001 001')
print ('002 001 1.0')
else: # Resposta foi Q
if FibA>=0:
print('001', '00'+str(FibA) if FibA<10
else '0'+str(FibA) if FibA<100 else FibA)
else: print('001 ' ,'-00'+str(abs(FibA)) if abs(FibA)<10
else '-0'+str(abs(FibA)) if
abs(FibA)<100 else FibA)
if FibB>=0:
print('002', '00'+str(FibB) if FibB<10 else
'0'+str(FibB) if FibB<100 else FibB,
FibB/FibA if FibA != 0 else " ") # evita
a divisão por 0
else: print('002' ,'-00'+str(abs(FibB)) if abs(FibB)<10 else '-0'+str(abs(FibB))
if abs(FibB)<100 else FibB, FibB/FibA if
FibA!=0 else " ") # evita a
divisão por 0#
Gera a sequência a partir do 3o. elementeo
for N in range (1, Ult+1): #gera uma linha
enquanto até o último elemento
Aux = FibA + FibB # Cada novo elemento será a soma
dos dois anteriores
FibA = FibB # O segundo elemento torna-se o primeiro
FibB = Aux # O segundo elemento recebe a soma dos dois anteriores
# Concatena um 00 à esquerda se Fib(N) for menor
do que 10
# e 0 se for maior do que 9 e menor do que 100 inserindo
- se for negativo
if FibB>0:
print('00'+str(N) if N<10 else '0'+str(N)
if N<100 else N,
'00'+str(FibB) if FibB<10 else
'0'+str(FibB) if FibB<100 else
FibB, FibB/FibA if FibA != 0 else " ")
else: print('00'+str(N) if N<10 else
'0'+str(N) if N<100 else N,
'-00'+str(abs(FibB)) if abs(FibB)<10
else
'-0'+str(abs(FibB)) if abs(FibB)<100
else FibB, FibB/FibA if FibA!=0 else " ")
RazAu = (1+math.sqrt(5))/2 #Razão Áurea
print('Compare com a razão áurea:\n',' '+str(RazAu)if
FibB>0 else ' '+str(RazAu))
Resultados:
Deseja a sequência de Fibonacci
(F) ou uma qualquer (Q)? Digite F ou Q: F Entre com o número de elementos: 10 N Fib(N) Razão 001 001 002 001 1.0 003 002 2.0 004 003 1.5 005 005 1.6666666666666667 006 008 1.6 007 013 1.625 008 021 1.6153846153846154 009 034 1.619047619047619 010 055 1.6176470588235294 Compare com a razão áurea: 1.618033988749895 |
Deseja a sequência de Fibonacci
(F) ou uma qualquer (Q)? Digite F ou Q: Q Entre com o primeiro número: 0 Entre com o segundo número: -5 Entre com o número de elementos: 10 N Qquer(N) Razão 001 000 002 -005 003 -005 1.0 004 -010 2.0 005 -015 1.5 006 -025 1.6666666666666667 007 -040 1.6 008 -065 1.625 009 -105 1.6153846153846154 010 -170 1.619047619047619 Compare com a razão áurea: 1.618033988749895 |