{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Aula de 30/03 - Um pouco mais de recursão\n", "\n", "Nessa aula veremos alguns problemas, que vão usar técnicas distintas, mas\n", "ainda usando formas simples de recursão\n", "\n", "Uma das coisas que podemos fazer com números inteiros é separar os seus\n", "dígitos um a um. Observe o cógido abaixo:\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "imprimedigito (generic function with 1 method)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function imprimedigito(n)\n", " if n <= 9\n", " println(n)\n", " println(\"fim\")\n", " else\n", " println(n % 10)\n", " imprimedigito(n ÷ 10)\n", " end\n", "end\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n", "6\n", "7\n", "5\n", "6\n", "fim\n" ] } ], "source": [ "imprimedigito(65767)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A função, imprime os dígitos do número de entrada do menos significativo ao mais significativo. Para isso, combina duas operação, o resto por 10, e a divisão por 10.\n", "\n", "É possível fazer algumas operações úteis com essa técnica, como por exemplo, somar os dígitos de um número. Se um número é divisível por três a soma dos seus dígitos também é divisível por três.\n", "\n", "Mas, para começar, vamos fazer o teste para uma função __somadigitos(n)__\n", "Quais seria casos interessantes a verificar?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "function testesd()\n", "end\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora sim, vamos pensar em como fazer para somar os dígito de um número, a cada etapa, temos que descascar uma parte (% 10), para em seguida tirar essa parte (div 10)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "function somadigitos(n)\n", "end\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# aqui é o local para brincar com a função :) por exemplo chamando a função recursivamente" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos tamném verificar se a valem algumas propriedades, como por exemplo, sera que dados dois números a soma dos seus dígitos é igual ao à soma dos dígitos da soma deles?\n", "\n", "De outra forma:\n", "somadigitos(a) + somadigitos(b) == somadigitos(a + b)\n", "\n", "e para o produto?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quem sabe usar números aleatórios __rand(Int)__ pode ajudar nessa verificação" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-441004277476167877" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rand(Int)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uma outra propriedade interessante que pode ser verificado usando o operador de resto da divisão é a primalidade.\n", "Isso é ver se um número $n$ é divisível apenas por ele mesmo e por 1.\n", "\n", "Mas, como sempre, vamos começar com os estes, assumindo que teremos a função __éprimo(x)__" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "function testeéprimo()\n", "end " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora sim, vamos pensar em como fazer a função, a forma simples e direta é tentar dividir o número candidato, por número de 2 até n / 2, se algum dividir, temos que o número não é primo. Caso contrário ele é primo." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora que já temos a nossa primeira função, podemos pensar em como otimizar" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para terminar, vamos imprimir os 100 primeiros primos?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Se der tempo, vamos imprimir uns primos de Mersenne. Um primo é de Mersenne se ele é da forma $2^n -1$." ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.1.1", "language": "julia", "name": "julia-1.1" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.1.1" } }, "nbformat": 4, "nbformat_minor": 2 }