Even getallen en keep

We willen een blok bouwen dat een lijst met getallen als invoer heeft en een lijst rapporteert met alle even getallen uit de invoerlijst.

Je weet al hoe je dit blok moet schrijven met de keepfunctie van hogere orde, maar laten we eens kijken hoe het eruit ziet met recursie:
Geen Afbeelding

Er zijn drie gevallen mogelijk, niet alleen het basisgeval en het recursieve geval. Er is nog steeds een basisgeval, namelijk een lege invoerlijst, in dat geval rapporteren we een lege lijst. Maar er zijn twee recursieve gevallen, afhankelijk van of het eerste element van de lijst even is. (Er moet een eerste element zijn als we niet met het basisgeval te maken hebben.) De groene blokken van het Functiesmenu delen het eerste getal door 2 en kijken of de rest van deze breuk gelijk is aan 0 (net als bij het omreken naar binair in Hoofdstuk 8 Les 3 Pagina 3: Omrekenen naar Binair). Als de rest gelijk is aan 0 dan is het getal even.

Als het eerste getal even is, dan willen we het getal toevoegen aan het resultaat dat we rapporteren. Dus we zetten dat getal voor de overige getallen in de recursieve aanroep. Als het eerste getal niet even is dan willen we het niet toevoegen aan het resultaat, dus we rapporteren alleen de waarde van de recursieve aanroep voor de overige getallen.

Net als meervoud , is de evencode een voorbeeld van een codepatroon. Er is niks speciaals aan even getallen hier. Hetzelfde patroon kan gebruikt worden om een lijst met oneven getallen te maken, of met getallen die eindigen op 7 of namen die beginnen met een "z".

Gebruik bij de volgende opdrachten recursie, geen functies van hogere orde.

    Probeer de code van even aan te passen.
  1. Schrijf een blok eindigt-edat een lijst met woorden als invoer heeft en een lijst met de woorden waarvan de laatste letter een e is, rapporteert.
    Geen Afbeelding
  2. Schrijf een blok getallen dat een lijst met woorden en getallen als invoer neemt en met alleen de getallen van die lijst rapporteert.
    Geen Afbeelding
  3. Generaliseer het patroon om een keepblok te maken.
  4. Als je niet met het combineblok van pagina Hoofdstuk 5 Les 3 Pagina 1: Algoritmes vergelijken hebt gewerkt, wil waarschijnlijk eerst kijken hoe dat blok werkt voordat je aan de volgende opdracht begint.
  5. Schrijf het combineblok. Let op: Het basis geval is een lijst met één element, niet een lege lijst.
Het bouwen van map , keep , en combine is een grote prestatie waar je trots op mag zijn. Ook al generaliseren deze blokken simpele patronen. Sommige mensen vinden functies van hogere orde te ingewikkeld en eng voor leerlingen om te gebruiken, laat staan ze te bouwen. Maar dat heb je net wel gedaan.
  1. Pas een sorteer algoritme aan dat je geschreven hebt in Hoofdstuk 8 Les 2 Pagina 1: Een Lijst Sorteren om als invoer een eigenschap te vergelijken, zoals het groene blok hieronder:
    Geen Afbeelding
    Op die manier kan je sorteren zodat het grootste element vooraan komt te staan.
Terug Volgende