Vamos então resolver aquele exercício do coeficiente binomial? Mas eu vou aproveitar a oportunidade para começar a falar de assunto muito importante que são o assunto dos testes, dos testes automatizados. Quando nós escrevemos programas de computador, programas linguagem de Python ou outras linguagens é muito comum nós cometermos erros. Afinal, somos seres humanos que cometemos erros. Às vezes o erro que a gente comete é erro de sintaxe da linguagem, o próprio compilador já detecta o erro, mas às vezes cometemos erro de lógica. Tem algo errado no nosso algoritmo e, portanto, ele não se comporta bem, não dá a resposta correta alguns casos. Portanto, sempre que a gente escreve código, alguma função, é importante também a gente escrever teste que vai verificar se aquela função está correta, e teste de forma automatizada. Ou seja, trecho de código que vai testar se aquela função está correta. Então a gente vai mostrar, vai ilustrar isso aqui à medida que a gente vai resolvendo esse coeficiente binomial. Então deixa eu abrir aqui o nosso IDLE e vamos criar novo arquivo para calcular o coeficiente binomial, mas antes lembra por que a gente está vendo isso aqui? Esse aqui é exemplo de uso de função, lembra que se eu quero n, k e k, quantas combinações de grupos de três de k elemento eu tenho num conjunto de n possibilidades aqui, n, k, k. é dado por essa fórmula: n fatorial dividido por k fatorial vezes n menos k fatorial. Então eu tenho fatorial três vezes, para evitar essa repetição de códigos, a gente vai extrair essa coisa aqui repetida para uma função que vai ser a função fatorial. Então primeiro vamos começar implementando essa função fatorial e eu estou fazendo esse exercício aqui a primeira vez, muito anos que eu estou escrevendo, então vamos juntos aqui implementar isso. Eu vou cometer erros, mas a gente vai consertando esses erros à medida que a gente vai fazendo. Então vejamos, primeira coisa o nome da função. Fatorial, a gente sempre tem que escolher nome que deixe muito claro o que aquela função faz. Ela calcula fatorial, ela vai se chamar fatorial. Ela vai receber como parâmetro número inteiro, eu vou chamar esse número de n. E aqui dentro eu vou colocar o código que vai calcular. Vejamos, dado n eu preciso calcular n vezes n menos vezes n menos dois, vezes n menos três fazendo essa multiplicação até chegar no. Depois do não precisei mais. Então é cálculo ali pouco complicado, eu vou precisar de laço pra fazer essas várias multiplicações, e eu vou precisar ir aos poucos guardando alguma variável essas multiplicações que eu estou fazendo. Então primeiro eu vou guardar numa variável, eu vou chamar essa variável de fat. Como eu vou fazer várias multiplicações, eu vou inicializar essa variável com que é o elemento neutro ali da multiplicação. E daí eu vou precisar agora laço, a gente já viu como a gente faz laço, é utilizando o comando while. Então eu vou fazer: enquanto, aqui eu preciso escrever uma expressão booleana, enquanto essa expressão booleana for verdadeira, eu vou repetindo aqueles comando que eu vou digitar logo seguida. Então eu vou repetindo, lembra que eu falei que eu começo lá no n e multiplico por n menos n menos dois, n menos três, até chegar no. Então eu vou fazer o seguinte, eu vou repetir, cada interação eu vou subtrair dessa variável n, por que dai fica n menos n menos dois eu vou sempre subtraindo até chegar na base aqui dessa fatorial que é quando o n fica igual a. Que daí não precisa mais multiplicar. Então eu vou fazer o seguinte, enquanto o n for maior do que daí eu faço o seguinte, primeiro o meu fatorial, valor novo do fatorial vai ser o valor antigo do fatorial vezes n, e depois que eu vou fazer o valor novo do n, vai ser o valor antigo do n menos então subtrai o. Então a cada interação do meu while, a cada repetição do meu laço, eu pego nessa variável fatorial, eu multiplico o n corrente, na primeira vez vai ser o próprio n que o usuário passou como parâmetro e depois eu subtraio o do n. Então primeiro ele vai multiplicar pelo n, depois pelo n menos depois pelo n dois, até chegar, n vai diminuindo até que n chega no valor. Quando o n chegar no ele vai fazer n recebe n menos e algum momento o n vai valer. Daí essa expressão booleana aqui do while vai deixar ser verdadeira. Porque se o n é igual a n não é maior do que. Então isso aqui vai valer falso, e ele vai cair fora do while. Quando ele cair fora do while aqui, nesse ponto aqui, a variável fat já contém ali o valor do n fatorial que a gente calculou e daí eu posso dar return fat. Então pronto, aqui está a definição da minha função fatorial. Eu acho que está certa, mas eu não tenho certeza. A gente vai ter que verificar pra ver se dá certo. A primeira verificação que eu vou fazer eu vou salvar aqui, mas eu preciso dizer nome de arquivo, vou chamar de fatorial. Fatorial.py. Vou salvar aqui. E eu vou executar isso aqui, ao executar, ele executou o que estava no arquivo. O que estava no arquivo é definição dessa função fatorial. Então a partir daqui a função fatorial já está definida e agora eu posso experimentar para ver se ele vai dar valor certo. Vamos por exemplo calcular o fatorial de cinco, deu 120, está certo. Eu lembro que o fatorial de cinco é exatamente é 120. Mas ele está certo só para este caso. Eu gostaria de escrever aqui, fazer teste automatizado para ver se nos principais casos isso aqui está dando certo. Como a gente poderia fazer isso? Eu vou escrever aqui, criar uma outra função. Uma função chamada testa_fatorial. Não recebe nenhum parâmetro e o que eu vou escrever aqui eu vou escrever uma série de testes para ver se esta testa_fatorial está funcionando. Então como eu vou fazer isso? Eu vou fazer: if fatorial de quanto é o fatorial de? O fatorial de tem que ser. Então, if fatorial de é igual a daí eu vou dizer que vou mandar imprimir, funciona para. Então isso aqui é meu primerio teste. Mas vamos fazer mais testes. Se fatorial de dois, fatorial de dois tem que ser dois. Eu vou dizer que funciona para dois. Mas uma coisa é importante, eu tenho que dizer se fatorial de não é igual a eu tenho que falar, caso contrário, eu tenho que dizer que não funciona. Não funciona para. E aqui, else Não funciona para dois. Agora, sempre quando a gente está fazendo esses testes automatizados é bom a gente pensar nos casos que podem ser mais problemáticos. E dois são casos ali normais. Tem outro caso que é caso bem problemático, que é o zero. Fatorial de zero tem que dar. Mas é por definição, a gente na verdade nem aplica uma fórmula, por definição o fatorial de zero é mas tem que funcionar também. Então vamos também testar esse caso. Se fatorial de zero é igual a vou dizer que funciona para zero. E vamos colocar também aqui caso pouquinho maior, por exemplo o fatorial de cinco. Fatorial de cinco eu sei que é 120, cinco vezes quatro, vezes três vezes dois, vezes tem que dar 120. Então agora eu vou executar isso aqui. Primeiro vamos ver se eu cometi algum erro de compilação aqui. Sim, eu cometi erro de compilação. Aqui nesta linha tem erro de compilação. Vamos ver se é isto aqui. Será que foi este o erro que eu cometi? Simplesmente executo de novo. Não. Não foi este o erro que eu cometi. O erro que eu cometi, já sei. Foi esse o erro que eu cometi. Sim, note que aqui ele está mostrando aqui vermelho a linha que tem o erro. Quer dizer que não tem mais esse erro aqui, então, na verdade, o que eu esqueci foi os dois pontos. Tinha esquecido dois pontos aqui, e esqueci dois pontos aqui. Às vezes quando a gente está aprendendo uma nova linguagem, ainda não está muito familiarizado com a sintaxe, a gente se esquece dos comandos daquela linguagem específica. Vamos ver se agora resolvemos os nossos problemas, pelo menos não tem mais erro de sintaxe. Pode ter erros de lógica. Vamos executar. Ele definiu essas duas funções, eu vou executar a minha função testa_fatorial, que vai testar aquela minha função fatorial. Vamos ver o que acontece. Ele repetiu aqui o funciona para zero, funciona para dois, porque eu esqueci de atualizar a mensagem de erro, então aqui estou testando tem que ser e testando dois, dois e dois. Aqui estou testando fatorial. Do zero então funciona para zero, aqui o fatorial do cinco funciona para cinco, executar novamente, run module para ele redifinir a função e agora, novamente, testa_fatorial. Funciona para para dois, para zero e para cinco. A nossa função fatorial está funcionando aqui, para pelo menos para esses valores, que acho que são valores que poderiam dar algum tipo de problema. Tem outro caso interessante que seria o fatorial de número negativo, o ideal que desse alguma mensagem de erro. Eu acho que o meu aqui não funciona para número negativo, fica de lição para vocês descobrirem se funciona ou não para número negativo. E para ver como isso aqui poderia ser consertado. Temos a função fatorial, e pelo menos parece que ela está funcionando, para vários casos importantes ela está funcionando. Agora a gente pode voltar para resolver o nosso problema aqui. Eu quero calcular o número binomial, que é essa expressão aqui. Então vamos fazer uma outra função. Definir aqui: def número binomial, e note, número binomial eu preciso de dois parâmetros: o n e o k. E daí, qual vai ser o valor dela? Return, vai ser o n fatorial, fatorial de n dividido o que vai no denominador, tudo no denominador, eu vou colocar parêntesis aqui para tudo o que vier no denominador. Vai o k fatorial vezes o fatorial voltando à formula, fatorial de k vezes o fatorial de n menos k. Fatorial de n menos k. Acho que é só isso, ficou bem simples essa função número binomial. Imagine se eu não tivesse a função fatorial, tivesse que repetir três vezes isso aqui com esses parâmetros diferentes, ia ficar muito complicado. Essa função binomial. Então, como eu posso organizar as coisas funções, como eu pude definir essa função fatorial, a função binomial ficou supersimples. Ainda não sei se está certo, vamos aqui compilar, executar. Errei a sintaxe alguma coisa de novo, hoje estou para esquecer os dois pontos. Ainda bem que o compilador nos ajuda e mostra exatamente onde é que estou esquecendo os dois pontos. Salvar, salvei, funcionou. A partir desse momento, já três funções estão disponíveis aqui: a função fatorial, a função número binomial e a função testa fatorial. Vamos ver aqui qual é o número binomial. Outros tipos possíveis de combinação, se eu tenho cinco números e quero combinações de três a três, cinco três a três, deu dez. Note que ele já deu 10.0 porque eu já estou fazendo aquela a divisão aqui já está devolvendo número fracionário. Se eu quisesse divisão inteira, eu tinha de colocar //. Vamos colocar // aqui e ver como é que é. Vamos aproveitar e pegar outro exemplo. Se eu quiser número binomial de 10,20 já não deu certo. Por que não deu certo? Eu desconfio que o fatorial de 20 é número muito grande. O fatorial de 20 é número muito grande. Não foi por isso que deu errado. Deu errado porque o k tem de ser menor ou igual ou ao n. K tem de ser menor ou igual ao n, número binomial de 20,10, aí deu certo. O que eu queria que vocês observassem, então, aqui conseguimos implementar essa função de número binomial de uma forma muito enxuta e muito fácil. Por quê? Porque pude separar o meu código várias funções e particular, se eu tinha três fatoriais, eu agora implemento uma única vez e chamo três vezes o fatorial. Eu não fiz ainda uma função testa, número binomial que, seria bom você calcular na mão ou pegar aluns valores, por exemplo, você pode pegar o triângulo de Pascal, que tem vários valores, e fazer vários testes para ver se essa implementação está correta ou não. Fica subexercício, uma sublição de casa para você fazer a função testa número binomial, para testar com vários valores diferentes para ver se está devolvendo valor correto. Espero que você tenha aprendido aqui duas coisas. Primeiro, como é que a gente pode organizar programa pouquinho mais complexo quebrando ele várias funções, e depois, como é importante a gente escrever funções de teste automatizado para ver se a nossa implementação está correta. Por enquanto é só. [MÚSICA] [MÚSICA] [MÚSICA]