{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "rising-heather",
   "metadata": {},
   "source": [
    "# Exercícios da aula 05"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "moral-protection",
   "metadata": {},
   "source": [
    "###  Exercício 1\n",
    "O que o programa a seguir vai imprimir?\n",
    "\n",
    "```python\n",
    "a = 1\n",
    "b = 2\n",
    "soma2(a,b)\n",
    "```\n",
    "\n",
    "e o programa\n",
    "```python\n",
    "a = 1\n",
    "b = 2\n",
    "soma2(b, a)\n",
    "```\n",
    "<!-- TEASER_END -->\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "equal-transfer",
   "metadata": {},
   "outputs": [],
   "source": [
    "def soma2(a,b):\n",
    "    print(a+2*b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "portuguese-commercial",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n"
     ]
    }
   ],
   "source": [
    "a = 1\n",
    "b = 2\n",
    "soma2(a,b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "awful-timothy",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4\n"
     ]
    }
   ],
   "source": [
    "a = 1\n",
    "b = 2\n",
    "soma2(b, a)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "solved-pierre",
   "metadata": {},
   "source": [
    "Existe uma diferença entre variáveis que são passadas como argumentos e os argumentos. A função `soma2` tem dois argumentos `a` e `b`. No primeiro exemplo, `a` assume o valor de `a` (definindo *fora* da função) e `b` assume o valor de `b` (definido *fora* da função). E portanto a função imprime o valor de `a + 2*2` que vale `5`.\n",
    "\n",
    "Já no segundo exemplo o `a` dentro da função assume o valor de `b` de fora da função e o `b` de dentro da função assume o valor de `a` de fora da função.\n",
    "\n",
    "O primeiro exempl equivale a `soma2(1,2)` e o segundo exemplo a `soma2(2,1)`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "wired-stuff",
   "metadata": {},
   "source": [
    "### Exercício 2\n",
    "Escreva a função `máximo` que retorna o maior de dois números"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "tropical-paintball",
   "metadata": {},
   "outputs": [],
   "source": [
    "def máximo(a,b):\n",
    "    if a > b:\n",
    "        return a\n",
    "    else:\n",
    "        return b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "orange-vision",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "máximo(1,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "criminal-commonwealth",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "máximo(2,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "intelligent-scout",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "máximo(1,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "valued-needle",
   "metadata": {},
   "source": [
    "### Exercício 3\n",
    "Escreva a função `múltiplo` que retorna `True` se o primeiro argumento for um múltiplo do segundo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "fifth-gauge",
   "metadata": {},
   "outputs": [],
   "source": [
    "def múltiplo(a, b):\n",
    "    return a % b == 0 and a > 0\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "broke-glossary",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "múltiplo(1,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "international-caution",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "múltiplo(0,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "retired-trick",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "múltiplo(4,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "wireless-victor",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "múltiplo(5,2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "listed-transformation",
   "metadata": {},
   "source": [
    "### Exercício 4\n",
    "Escreva a função `área_quadrado` que recebe o lado de um quadrado e calcula a área."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "conceptual-fruit",
   "metadata": {},
   "outputs": [],
   "source": [
    "def área_quadrado(L):\n",
    "    return L*L\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "intellectual-forward",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "área_quadrado(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "backed-going",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "área_quadrado(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "photographic-creator",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10.889999999999999"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "área_quadrado(3.3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "spiritual-centre",
   "metadata": {},
   "source": [
    "### Exercício 5\n",
    "Escreve a função `área_triângulo` que recebe a base e a altura de um triângulo e retorna a sua área"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "biblical-position",
   "metadata": {},
   "outputs": [],
   "source": [
    "def área_triângulo(B,H):\n",
    "    return B*H/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "promotional-sheriff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "área_triângulo(1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "broke-marshall",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "área_triângulo(1,2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "inside-corner",
   "metadata": {},
   "source": [
    "### Exercício 6\n",
    "Reescreve a função para pesquisar uma lista (`pesquise`) acima de modo a que use os métodos de pesquisa em lista que vimos na última aula."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "weekly-chile",
   "metadata": {},
   "outputs": [],
   "source": [
    "def pesquise(L, val):\n",
    "    return L.index(val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "excessive-flight",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pesquise([1,2,3,4], 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "great-paris",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pesquise([1,2,3,4], 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "lasting-archives",
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "5 is not in list",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_39169/664349085.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpesquise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/tmp/ipykernel_39169/4221004609.py\u001b[0m in \u001b[0;36mpesquise\u001b[0;34m(L, val)\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mpesquise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m: 5 is not in list"
     ]
    }
   ],
   "source": [
    "pesquise([1,2,3,4], 5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "guided-consortium",
   "metadata": {},
   "source": [
    "### Exercício 7\n",
    "Defina uma função recursive que calcule o maior divisor comum (MDC) entre dois números a e b em que a > b.\n",
    "\n",
    "`mdc(a,b) = a` se `b==0` e se `a > b`, `mdc(a,b) = mdc(b, a % b)`\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "internal-dynamics",
   "metadata": {},
   "outputs": [],
   "source": [
    "def mdc(a,b):\n",
    "    if b==0:\n",
    "        return a\n",
    "    elif a > b:\n",
    "        return mdc(b, a % b)\n",
    "    else:\n",
    "        return mdc(a, b % a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "specialized-standard",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mdc(8,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "annual-dance",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mdc(2,8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "special-sunglasses",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mdc(8,8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "loved-preservation",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "24"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mdc(1*2*3*4*5, 1*2*3*4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "compact-voltage",
   "metadata": {},
   "source": [
    "### Exercício 8\n",
    "Usando a função `mdc` do exercício anterior, defina uma função para calcular o mínimo múltiplo comum (MMC) entre dois números:\n",
    "\n",
    "$$\n",
    "mmc(a,b) = \\frac{|a\\times b|}{mdc(a,b)}\n",
    "$$\n",
    "\n",
    "Lembre que $|a \\times b|$ é escrito como `abs(a * b)` em Python."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "smaller-invention",
   "metadata": {},
   "outputs": [],
   "source": [
    "def mmc(a,b):\n",
    "    return abs(a*b) // (mdc(a,b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "liable-girlfriend",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mmc(4,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "treated-silence",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mmc(5,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "optical-honor",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mmc(5,5*4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "laughing-cartridge",
   "metadata": {},
   "source": [
    "### Exercício 9\n",
    "\n",
    "Reescreva o programa para calcular a sequência de Fibonacci sem utilizar recursão.\n",
    "\n",
    "Compare o desempenho com a função recursiva. Se você estiver usando o notebook do jupyter ou o ipython você pode usar a instrução %time como mostrado a seguir\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "casual-proposal",
   "metadata": {},
   "outputs": [],
   "source": [
    "def fibonacci_recursivo(n):\n",
    "    if n <= 1:\n",
    "        return n\n",
    "    else:\n",
    "        return fibonacci_recursivo(n-1) + fibonacci_recursivo(n-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "abstract-priest",
   "metadata": {},
   "outputs": [],
   "source": [
    "def fibonacci(n):\n",
    "    if n <= 1:\n",
    "        return n\n",
    "    fib_n_menos_1 = 0\n",
    "    fib_n = 1\n",
    "    \n",
    "    for i in range(2,n+1):\n",
    "        tmp = fib_n\n",
    "        fib_n = fib_n + fib_n_menos_1\n",
    "        fib_n_menos_1 = tmp\n",
    "    return fib_n\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "advanced-fabric",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[fibonacci(i) for i in range(11)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "controlled-ecuador",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[fibonacci_recursivo(i) for i in range(11)]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "forbidden-relaxation",
   "metadata": {},
   "source": [
    "### Vamos medir o tempo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "statewide-symphony",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "279 ns ± 0.831 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "limiting-liability",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "399 ns ± 2.29 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "second-diamond",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "607 ns ± 1.09 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "rising-detective",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "817 ns ± 1.45 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "orange-constraint",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.06 µs ± 1.74 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "seasonal-gossip",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.3 µs ± 4.71 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "passing-authority",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.53 µs ± 4.33 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "organized-airfare",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.78 µs ± 11.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(35)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "dynamic-jungle",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.99 µs ± 5.67 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci(40)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "large-moment",
   "metadata": {},
   "outputs": [],
   "source": [
    "n1 = [2, 5,10,15,20,25,30,35] #,40]\n",
    "t1 = [279e-9,399e-9, 607e-9, 817e-9, 1.06e-6, 1.3e-6, 1.53e-6, 1.78e-6] #, 1.99e-6]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "rolled-blowing",
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "indie-impact",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f2781094190>]"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(n1, t1, \"o\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "potential-barcelona",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "300 ns ± 0.703 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci_recursivo(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "authentic-controversy",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.46 µs ± 2.44 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci_recursivo(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "informative-alexandria",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "17.1 µs ± 20.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci_recursivo(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "another-meditation",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "190 µs ± 681 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci_recursivo(15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "compliant-million",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.13 ms ± 7.45 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci_recursivo(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "decreased-landing",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "23.5 ms ± 89.6 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci_recursivo(25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "imperial-range",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "260 ms ± 711 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci_recursivo(30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "complimentary-convention",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.92 s ± 5.12 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%timeit fibonacci_recursivo(35)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "seeing-seminar",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "every-nothing",
   "metadata": {},
   "outputs": [],
   "source": [
    "n2 = [2,5,10,15,20, 25, 30, 35]\n",
    "t2 = [300e-9, 1.46e-6, 17.1e-6, 190e-6, 2.13e-3, 23.5e-3, 260e-3, 2.92]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "excited-fever",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f2781079730>]"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(n2, t2, \"o\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "graduate-october",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f27810cb700>]"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAATgElEQVR4nO3dfYyl53nX8e/P604TG0hf4s5Uu16vy1pWrVC1eLT5o1AZqMuGerMlLa2NkRK8yjYIV0UIURcjUZCirRBUqI1p2FLLdbO1tUrTdhOMTAWYTSULdjYEsmYxWVl2PLVnd0NewLhScHzxxzlLJmdefGaeZ+bcM+f7kY5mzr3Pec7lW97f3HvdzzwnVYUkafe7btIFSJK2h4EvSVPCwJekKWHgS9KUMPAlaUpcP+kC1vPOd76zDhw4MOkyJGlHOX/+/Ber6qbR8SYDP8kR4MjBgwdZWFiYdDmStKMkeWm18SZbOlX1yao6/o53vGPSpUjSrtFk4EuS+tdk4Cc5kuTkV7/61UmXIkm7RpOBb0tHkvrXZOC7wpek/jUZ+K7wJfVtbg6SlY+5uUlXtn2aDHxJ6tvlyxsb340MfEmaEk0Gvj18Sepfk4FvD1+S+tdk4EuS+mfgS5oKs7MbG9+Nmrx5miT1bWlp0hVMXpMrfDdtJal/TQa+m7aS1L8mA1+S1D8DX5KmhIEvSVNi267SSXIj8M+BrwHPVNWp7XpvSVLHFX6SR5NcSXJhZPxwkueTXEry0HD4fcDHq+qDwHu7vK8kaeO6tnQeAw4vH0iyB3gEeA9wB3BfkjuAfcDLw8O+3vF9JUkb1Cnwq+os8KWR4UPApap6oaq+BjwJHAUWGYT+uu+b5HiShSQLV69e7VKeJGmZrdi03cs3VvIwCPq9wCeAH0/yq8An13pxVZ2sqvmqmr/pppu2oDxJmk5bsWmbVcaqqv4P8NfHOkFyBDhy8ODBXguTpGm2FSv8ReDmZc/3Aa9swftIkjZgKwL/HHBbkluTzAD3Amc2cgJvrSBJ/et6WeYTwLPA7UkWkxyrqjeAB4GngYvA6ap6boPn9eZpktSzVNWka1jT/Px8LSwsTLoMSdpRkpyvqvnR8SZvreAKX5L612Tg28OXpP41Gfiu8CWpf00Gvit8Sepfk4EvSepfk4FvS0eS+tdk4NvSkaT+NRn4knaeuTlIVj7m5iZdma5pMvBt6Ug7z+XLGxvX9msy8G3pSFL/mgx8SVL/DHxJmhIGviRNiSYD301baeeZnd3YuLZfk4Hvpq208ywtQdXKx9LSpCvTNU0GviSpfwa+JE0JA1+SpsS2BX6S70ny60k+vl3vKUn6hrECP8mjSa4kuTAyfjjJ80kuJXlovXNU1QtVdaxLsZKkzbt+zOMeAz4CPH5tIMke4BHgbmAROJfkDLAHODHy+geq6krnaiVJmzZW4FfV2SQHRoYPAZeq6gWAJE8CR6vqBHBPr1VKkjrr0sPfC7y87PnicGxVSb4zyUeBH0jy8+scdzzJQpKFq1evdihPkrTcuC2d1WSVsVrr4Kr6n8CH3uqkVXUyyavAkZmZmTs71CdJWqbLCn8RuHnZ833AK93KkSRtlS6Bfw64LcmtSWaAe4EzfRTlrRUkqX/jXpb5BPAscHuSxSTHquoN4EHgaeAicLqqnuujKG+eJkn9S9WabfeJm5+fr4WFhUmXIUk7SpLzVTU/Ot7krRVc4UtS/5oMfHv4ktS/JgPfFb4k9a/JwHeFL0n9azLwJUn9azLwbelIUv+aDHxbOpLUvyYDX5LUvyYD35aOtNLcHCQrH3Nzk65MO0WTgW9LR1rp8uWNjUujmgx8SVL/DHxJmhIGviRNiSYD301bSepfk4Hvpq200uzsxsalUV0+01bSNlpamnQF2umaXOFLkvpn4EvSlNjWwE/yY0l+LcnvJfmR7XxvSZp2Ywd+kkeTXElyYWT8cJLnk1xK8tB656iq362qDwIfAH5qUxVLkjZlI5u2jwEfAR6/NpBkD/AIcDewCJxLcgbYA5wYef0DVXVl+P3fH75OkrRNxg78qjqb5MDI8CHgUlW9AJDkSeBoVZ0A7hk9R5IAvwj866r6zKarliRtWNce/l7g5WXPF4dja/kZ4IeBn0jyodUOSHI8yUKShatXr3YsT5J0Tdfr8LPKWK11cFX9MvDL652wqk4meRU4MjMzc2fH+iRJQ11X+IvAzcue7wNe6XhOSdIW6Br454DbktyaZAa4FzjTtShvrSBJ/dvIZZlPAM8CtydZTHKsqt4AHgSeBi4Cp6vqua5FefM0SepfqtZsuU/c/Px8LSwsTLoMSdpRkpyvqvnR8SZvreAKX5L612Tg28OXpP41Gfiu8CWpf00Gvit8Sepfk4EvSepfk4FvS0eS+tdk4NvSkaT+NRn4kqT+NRn4tnQkqX9NBr4tHUnqX5OBL03C3BwkKx9zc5OuTOqHgS8NXb68sXFppzHwJWlKNBn4btpKUv+aDHw3bSWpf00GviSpfwa+NDQ7u7Fxaae5ftIFSK1YWpp0BdLWcoUvSVNi2wI/yfcm+WiSjyf5G9v1vpKkgbECP8mjSa4kuTAyfjjJ80kuJXlovXNU1cWq+hDwk8CKD9eVJG2tcVf4jwGHlw8k2QM8ArwHuAO4L8kdSf5Ukk+NPL5r+Jr3An8A/Nve/gskSWMZa9O2qs4mOTAyfAi4VFUvACR5EjhaVSeAe9Y4zxngTJJ/BfzWasckOQ4cB9i/f/845UmSxtDlKp29wMvLni8C717r4CR3Ae8DvhV4aq3jqupkkleBIzMzM3d2qE+StEyXwM8qY7XWwVX1DPDMOCeuqk8Cn5yfn//gpiqTJK3Q5SqdReDmZc/3Aa90K2fAe+lIUv+6BP454LYktyaZAe4FzvRTliSpb+NelvkE8Cxwe5LFJMeq6g3gQeBp4CJwuqqe66Mob54mSf0b9yqd+9YYf4p1NmA3K8kR4MjBgwf7PrUkTa0mb63gCl+S+tdk4LtpK0n9azLwXeFLUv+aDHxJUv+aDHxbOpLUvyYD35aOJPWvycCXJPXPwJekKdFk4NvDl6T+NRn49vAlqX9NBr52p7k5SFY+5uYmXZk0HQx8bZvLlzc2LqlfBr4kTYkmA99NW0nqX5OB76atJPWvycCXJPXPwNe2mZ3d2Likfo31iVdSH5aWJl2BNN22dYWf5MYk55Pcs53vK0ka/0PMH01yJcmFkfHDSZ5PcinJQ2Oc6ueA05spVJLUzbgtnceAjwCPXxtIsgd4BLgbWATOJTkD7AFOjLz+AeD7gP8GvK1byZKkzRgr8KvqbJIDI8OHgEtV9QJAkieBo1V1AljRskny54AbgTuAP0ryVFW9ucpxx4HjAPv379/Af4okaT1dNm33Ai8ve74IvHutg6vqYYAkHwC+uFrYD487meRV4MjMzMydHeqTJC3TZdM2q4zVW72oqh6rqk+9xTH+4pUk9axL4C8CNy97vg94pVs5A95aQZL61yXwzwG3Jbk1yQxwL3Cmn7IkSX0b97LMJ4BngduTLCY5VlVvAA8CTwMXgdNV9VwfRdnSkaT+jXuVzn1rjD8FPNVrRQxaOsCRgwcP9n1qSZpaTd5LxxW+JPWvycB301aS+tdk4LvCl6T+NRn4kqT+NRn4tnQkqX9NBr4tHUnqX5OBL0nqn4EvSVOiycC3hy9J/Wsy8O3hS1L/mgx8SVL/DHxJmhIG/i4yNwfJysfc3KQrk9SCJgPfTdvNuXx5Y+OSpkuTge+mrST1r8nAlyT1z8CXpClh4EvSlNi2wE9yV5JPJ/lokru2632nyezsxsYlTZdxP8T80SRXklwYGT+c5Pkkl5I89BanKeA14G3A4ubK1XqWlqBq5WNpadKVSWrBWB9iDjwGfAR4/NpAkj3AI8DdDAL8XJIzwB7gxMjrHwA+XVX/Icks8EvA/d1KlyRtxFiBX1VnkxwYGT4EXKqqFwCSPAkcraoTwD3rnO7LwLeu9YdJjgPHAfbv3z9OeZKkMYy7wl/NXuDlZc8XgXevdXCS9wF/Efg2Bv9aWFVVnUzyKnBkZmbmzg71SZKW6bJpm1XGaq2Dq+oTVfXTVfVTVfXMeif2F68kqX9dAn8RuHnZ833AK93KGfDWCpLUvy6Bfw64LcmtSWaAe4EzfRTlCl+S+jfuZZlPAM8CtydZTHKsqt4AHgSeBi4Cp6vquT6KcoUvSf0b9yqd+9YYfwp4qteKJElboslbK9jSkaT+NRn4kqT+NRn49vAlqX9NBr4tHUnqX5OB7wpfkvrXZOC7wpek/jUZ+JKk/hn4kjQlmgx8e/iS1L8mA98eviT1r8nAl6SpdOoUHDgA1103+HrqVK+nN/AlTY8tDtROTp2C48fhpZcGH0b90kuD5z3WaOBLmg7bEKidPPwwvP76N4+9/vpgvCdNBr6bttIO1fIKehsCtZMvfGFj45vQZOC3umk7NwfJysfc3KQrkxrQ+gp6GwK1k/37Nza+CU0GfqsuX97YuNQ7V9Cbtw2B2smHPww33PDNYzfcMBjviYEv7RSuoLvZhkDt5P774eRJuOWWQevgllsGz++/v7e3SFX1drK+zc/P18LCwqTL+P+Stf+s4WnUbnHgwCDkR91yC7z44nZXs1Lr9cHgh+PDDw9+CO3fPwj7HgO1FUnOV9X86Pi2rfCTXJfkw0l+Jcn7t+t9pQ1puWXiCrq7++8f/PB5883B110Y9usZ90PMH01yJcmFkfHDSZ5PcinJQ29xmqPAXuD/AoubK1faQq23TFrvQW9DS0LdjNXSSfJDwGvA41X1ruHYHuB/AHczCPBzwH3AHuDEyCkeGD6+XFX/IsnHq+on3up9W2vpzM2tvkE7OwtLS9tfj3rWekvi2g+k5RujN9xgqGqFTi2dqjoLfGlk+BBwqapeqKqvAU8CR6vqc1V1z8jjCoMfCl8evvbr6xR6PMlCkoWrV6+OU962WVoaLPxGH4b9Btgy2TxX0Oro+g6v3Qu8vOz5IvDudY7/BPArSf4scHatg6rqJHASBiv8DvWpNaMr1GstE2gjtPbvX32F30rLBAbz1MJcaUfqsmm72jUrawZ0Vb1eVceq6meq6pF1T+xv2u5OrV+nvRM2HaUOugT+InDzsuf7gFe6laPObJlsni0T7XJjX4ef5ADwqWWbttcz2LT9C8AfMti0/atV9VxfxbW2adu81jf1Wt8UlXaJTpu2SZ4AngVuT7KY5FhVvQE8CDwNXARO9xX2tnQ2yZaJpHX4m7a7yXXXrf4rv8ngF01aMCW/6ShN0lor/C5X6WyZJEeAIwcPHpx0KTuLV5lIWkeTN09r9fbIzbNlImkdTQZ+0z38lq+C8SoTSeuwh78RrV8FI0k0cLfMXaH1q2AkaR1NBv5mWzpb/hGErf/ikCSto8nA3+ym7ZZ/BGHrt6eVpHU0GfjN8ioYSTtYk4Hf7FU6XgUjaQfbVVfp+JmzkuRVOpI09XZV4M++4482NC5J02RXBf7SV95OfewUdcsBKtcNvn7sFEtfefukS5OkiWuyh7/s5mkf/PznPz/pciRpR9lRPXxvniZJ/Wsy8CVJ/TPwJWlKGPiSNCUMfEmaEk1epXNNkqvAKp/Z14R3Al+cdBHrsL5urK8b6+uma323VNVNo4NNB37LkiysdtlTK6yvG+vrxvq62ar6bOlI0pQw8CVpShj4m3dy0gW8Bevrxvq6sb5utqQ+e/iSNCVc4UvSlDDwJWlKGPibkOTFJJ9L8tkk438k19bV82iSK0kuLBv7jiS/n+Tzw6/f3lh9v5DkD4dz+Nkkf2mC9d2c5N8nuZjkuSQ/OxxvYg7Xqa+JOUzytiT/Kcl/Gdb3D4fjrczfWvU1MX/L6tyT5D8n+dTwee/zZw9/E5K8CMxXVRO/uJHkh4DXgMer6l3DsX8MfKmqfjHJQ8C3V9XPNVTfLwCvVdU/mURNyyX5buC7q+ozSf44cB74MeADNDCH69T3kzQwh0kC3FhVryX5FuAPgJ8F3kcb87dWfYdpYP6uSfK3gXngT1TVPVvxd9gV/i5QVWeBL40MHwV+Y/j9bzAIiIlYo75mVNWrVfWZ4ff/G7gI7KWROVynvibUwGvDp98yfBTtzN9a9TUjyT7gR4F/uWy49/kz8DengH+T5HyS45MuZg2zVfUqDAID+K4J17OaB5P812HLZ2Itp+WSHAB+APiPNDiHI/VBI3M4bEd8FrgC/H5VNTV/a9QHjcwf8M+Avwu8uWys9/kz8DfnB6vqTwPvAf7msGWhjflV4E8C3w+8CvzTiVYDJPljwG8Df6uq/tek6xm1Sn3NzGFVfb2qvh/YBxxK8q5J1bKaNeprYv6S3ANcqarzW/1eBv4mVNUrw69XgN8BDk22olVdHvZ+r/WAr0y4nm9SVZeHfwnfBH6NCc/hsLf728CpqvrEcLiZOVytvtbmcFjTV4BnGPTHm5m/a5bX19D8/SDw3uHe4JPAn0/yMbZg/gz8DUpy43DjjCQ3Aj8CXFj/VRNxBnj/8Pv3A783wVpWuPY/8tBfZoJzONzU+3XgYlX90rI/amIO16qvlTlMclOSbxt+/3bgh4H/Tjvzt2p9rcxfVf18Ve2rqgPAvcC/q6q/xhbMn1fpbFCS72Gwqge4HvitqvrwBEsiyRPAXQxuqXoZ+AfA7wKngf3AF4C/UlUT2Thdo767GPxTuoAXgZ++1q+cQH1/Bvg08Dm+0UP9ewz65BOfw3Xqu48G5jDJ9zHYVNzDYBF5uqr+UZLvpI35W6u+36SB+VsuyV3A3xlepdP7/Bn4kjQlbOlI0pQw8CVpShj4kjQlDHxJmhIGviRNCQNfkqaEgS9JU+L/AeGmXt1M8yh5AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "plt.semilogy(n1, t1, \"ro\", label=\"Iteração\")\n",
    "plt.semilogy(n2, t2, \"bs\", label=\"Iteração\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "id": "ambient-immune",
   "metadata": {},
   "outputs": [],
   "source": [
    "fator_mult = [t2[i] / t1[i] for i in range(len(t1))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "hourly-biotechnology",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f2780cfd850>]"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.semilogy(n1, fator_mult, \"ro\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "happy-hypothetical",
   "metadata": {},
   "source": [
    "#### Análise do custo\n",
    "\n",
    "O custo de cálculo do número de Fibonacci aumenta linearmente conforme n aumenta. \n",
    "\n",
    "Já a usando a definição recursiva, o custo aumenta de maneira considerável. No último gráfico, com eixo log em y, pode-se ver que o custo da função recursiva aumenta exponencialmente em relação à implementação usando iteração. Assim, dado um número `n`, o custo computacional pode ser descrito assim:\n",
    "\n",
    "* Algoritmo iterativo: $\\mathcal{O}(n)$\n",
    "* Algoritmo recursivo: $\\mathcal{O}(n\\cdot \\exp n)$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "specific-episode",
   "metadata": {},
   "source": [
    "### Exercício 10\n",
    "Na aula 03 implementamos o algoritmo de reordenação de listas bubble sort. Crie uma função `bubble_sort` que reordena os elementos de uma lista de números em ordem crescente"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "portuguese-methodology",
   "metadata": {},
   "outputs": [],
   "source": [
    "def bubble_sort(L):\n",
    "    N = len(L)\n",
    "    for i in range(N):\n",
    "        trocou = False\n",
    "        for k in range(N-i-1):\n",
    "            if L[k] > L[k+1]: # Inverter a posição\n",
    "                trocou = True\n",
    "                tmp = L[k]\n",
    "                L[k] = L[k+1]\n",
    "                L[k+1] = tmp\n",
    "        if not trocou:\n",
    "            break\n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "defined-recognition",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2, 3, 4, 4, 5, 6, 6, 23, 32, 345, 2345]"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L = [23,4,5,2,3,6,2345,6,32,345,4]\n",
    "bubble_sort(L)\n",
    "L"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "environmental-arizona",
   "metadata": {},
   "source": [
    "### Exercício 11\n",
    "Mude o programa do exercício 10 de modo que tenha um segundo parâmetro `comparador` que é uma função que compara dois elementos\n",
    "```python\n",
    "def maior(a, b):\n",
    "    return a > b\n",
    "\n",
    "def bubble_sort(L, comparador=maior)\n",
    "    # Corpo da função\n",
    "```\n",
    "Esse segundo parâmetro é o que compara os elementos da lista. Se esse parâmetros for a função `maior`, a lista será reordenada em ordem crescente.\n",
    "\n",
    "Qual seria a função passada para o parâmetro `comparador` para que a lista fosse reordenada em ordem decrescente?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "adolescent-albany",
   "metadata": {},
   "outputs": [],
   "source": [
    "def maior(a,b):\n",
    "    return a > b\n",
    "def menor(a,b):\n",
    "    return a < b\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "id": "solid-report",
   "metadata": {},
   "outputs": [],
   "source": [
    "def bubble_sort(L, comparador=maior):\n",
    "    N = len(L)\n",
    "    for i in range(N):\n",
    "        trocou = False\n",
    "        for k in range(N-i-1):\n",
    "            if comparador(L[k],L[k+1]): # Inverter a posição\n",
    "                trocou = True\n",
    "                tmp = L[k]\n",
    "                L[k] = L[k+1]\n",
    "                L[k+1] = tmp\n",
    "        if not trocou:\n",
    "            break\n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "surface-wallace",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2, 3, 4, 4, 5, 6, 6, 23, 32, 345, 2345]"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L = [23,4,5,2,3,6,2345,6,32,345,4]\n",
    "bubble_sort(L, maior)\n",
    "L"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "acceptable-valuable",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2345, 345, 32, 23, 6, 6, 5, 4, 4, 3, 2]"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L = [23,4,5,2,3,6,2345,6,32,345,4]\n",
    "bubble_sort(L, menor)\n",
    "L"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "systematic-peninsula",
   "metadata": {},
   "source": [
    "### Exercício 12\n",
    "Escreva uma função `mapa` que recebe como primeiro parâmetro uma função e segundo parâmetro uma lista e cria uma nova lista aplicando esta função em cada elemento da lista. \n",
    "    \n",
    "\n",
    "Exemplo:\n",
    "```python-repl\n",
    "In [10]: def dobro(n):\n",
    "    ...:     return 2*n\n",
    "    ...: \n",
    "\n",
    "In [11]: mapa(dobro, [1,2,3])\n",
    "Out[11]: [2, 4, 6]\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "amber-valentine",
   "metadata": {},
   "outputs": [],
   "source": [
    "def mapa(fun, L):\n",
    "    Lout = []\n",
    "    for e in L:\n",
    "        v = fun(e)\n",
    "        Lout.append(v)\n",
    "    return Lout"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "economic-carry",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def dobro(n):\n",
    "    return 2*n\n",
    "mapa(dobro, range(10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "revised-baker",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mapa(lambda x: x**2, range(10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "id": "resident-moses",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3, 2, 1, 0, 7, 6, 5, 4, 11, 10]"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mapa(lambda x: x^3, range(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "unauthorized-czech",
   "metadata": {},
   "source": [
    "#### Funções lamda\n",
    "\n",
    "São funções pequenas de uma linha que são usadas para serem passadas como argumentos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "wooden-japanese",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
