Exempel. Rekursion. Iterativ motsvarighet. fakultet.c. fibonacci.c Fibonaccisekvensen definieras som följer ƒ 0 =0, ƒ 1 =1, ƒ i+1 =ƒ i +ƒ i-1, i=1,2,



Relevanta dokument
Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

Bitvisa operationer. Programmeringsteknik 195

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

.c och.h filer. Programmeringsteknik 113

Strängar. Strängar (forts.)

Föreläsning 5: Rekursion

C-programmering. Målsättning Introducera programmering i C för de som inte har någon erfarenhet av C eller C++. Litteratur

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Programmeringsteknik med C och Matlab

DD1361 Programmeringsparadigm. Carina Edlund

Föreläsning 1 & 2 INTRODUKTION

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Tentamen i Programmering grundkurs och Programmering C

( ostream ) << ( annan datatyp ) : ostream

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Rekursion: varför? Problem delas upp i mindre bitar algoritm för att lösa problemet erhålls från problemformuleringen

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Träning i bevisföring

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Att komma igång. Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program

Föreläsning 6: Introduktion av listor

Föreläsning 2: Avlusning och antilustekniker

Funktionens deklaration

Att koda en magnetremsa i plastkortskrivare med inbyggd magnetkodare.

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Tentamen i. Programmering i språket C

Du ska nu skapa ett litet program som skriver ut Hello World.

Tentamen i Programmering grundkurs och Programmering C

Programmera en NXT Robot

Övning från förra gången: readword

Vad är det och hur definierar vi en Biblioteksfunktioner (math) Top-down-programmering lokala globala variabler Arrays som in-parametrar

Programexempel: tärningsspel

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Att använda pekare i. C-kod

Heltal(int) Programmeringsteknik 54

FRÅN A TILL Ö LäraMera Ab / och Allemansdata Ab / FRÅN A TILL Ö

Vi skall skriva uppsats

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

1 Funktioner och procedurell abstraktion

DATASAMORDNING NYHETERNA I CHAOS Utbildning Chaos/Handledning - Nyheterna i Chaos 3/

Idag: Dataabstraktion

Det finns många flaggor till g++,

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Enkla datatyper minne

Rekursion och induktion för algoritmkonstruktion

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Programmering A. Johan Eliasson

Individuellt Mjukvaruutvecklingsprojekt

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Föreläsning 13 och 14: Binära träd

Våra enkla funktioner eller procedurer

Tentamen i Programmering grundkurs och Programmering C

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4

Tillämpad UNIX. Laborations-PM Christian von Schultz, Programpaket och processhantering

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Klasser och objekt i C#

Föreläsning 8: Räkning. Duvhålsprincipen. Kombinatorik

Lathund, procent med bråk, åk 8

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

ANVÄND NAVIGATIONEN I CAPITEX SÄLJSTÖD

Elektronen och laddning

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Utveckla arbetsmiljö och verksamhet genom samverkan

Programmeringsteknik med C och Matlab

konstanterna a och b så att ekvationssystemet x 2y = 1 2x + ay = b 2 a b

Uppgift 1 ( Betyg 3 uppgift )

Lathund för överföring av rapporter och ljudfiler

Textsträngar från/till skärm eller fil

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Introduktion C-programmering

Skizz till en enkel databas

tentamensdags och lab 3

Tentamen OOP

PROGRAMMERING A VB6 UTVECKLINGSVERKTYGET VISUAL BASIC

Hur skapar man formula r

Tentamen TEN1 HI

Kursplan i svenska. Därför tränar vi följande färdigheter under elevens skoltid i ämnet svenska: Tala, lyssna och samtala. År 1

Ekvationssystem, Matriser och Eliminationsmetoden

Handledning för digitala verktyg Talsyntes och rättstavningsprogram. Vital, StavaRex och SpellRight

Listor. TDDD73 Funktionell och imperativ programmering i Python Föreläsning 7. Peter Dalenius Institutionen för datavetenskap

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

Dash and Dot. Svårighetsgraden bestämmer du själv genom att välja någon av av de 5 appar som är kopplade till Dash & Dot.

Svenska Du kan med flyt läsa texter som handlar om saker du känner till. Du använder metoder som fungerar. Du kan förstå vad du läser.

Transkript:

Rekursion En funktion är rekursiv om den anropar sig själv, direkt eller indirekt. Alla funktioner kan anropas rekursivt. I sin enklaste form är rekursion enkel att förstå. printf("the universe is never ending\n"); main(); return 0; /* Kommer aldrig att nås */ Exempel För att summera de fyra första heltalen kan man skriva sum(4) där sum är funktionen nedan int sum(int n) { if (n == 1) return n; else return n + sum(n-1); sum(1) 1 sum(2) 2 + sum(1) eller 2 + 1 sum(3) 3 + sum(2) eller 3 + 2 + 1 sum(4) 4 + sum(3) eller 4 + 3 + 2 + 1 202 203 fakultet.c Matematiskt så lyder definitionen av fakultet som följer 0!=1, n!=n (n-1) 2 1 n>0 eller ekvivalent 0!=1, n!=n (n-1)! n>0 I C kan detta skrivas rekursivt som Iterativ motsvarighet Funktionen kan också skrivas iterativt int factorial (int n) { int product = 1; for ( ; n > 1; n-- ) product *= n; return product; int factorial (int n) { return (n == 0? 1 : n * factorial(n-1) ); 204 205 Effektivitet Många algoritmer har både rekursiva och iterativa lösningar. Normalt så är den rekursiva formuleringen vackrare och använder färre variabler för att göra samma beräkning. Vissa datorspråk använder bara rekursion för att åstadkomma upprepning (dvs. de har inte t.ex. while eller for). Rekursion orsakar att datorn lägger gamla värden av variabler i en stack för att komma ihåg dem. Ofta kan rekursion orsaka många funktionsanrop. fibonacci.c Fibonaccisekvensen definieras som följer ƒ 0 =0, ƒ 1 =1, ƒ i+1 =ƒ i +ƒ i-1, i=1,2, int fibonacci (int n) { return (n <= 1? n : fibonacci(n-1) + fibonacci(n-2); N fibonacci(n) Antalet funktionsanrop 0 0 1 1 1 1 2 1 3 37 24157817 78176337 38 39088169 126491971 206 207 1

Rekursion vs. iteration Vissa programmerare anser att rekursion inte ska användas p.g.a. de många funktionsanropen ineffektivitet. Rekursion har dock många fördelar de är ofta enklare att skriva lättare att förstå lättare att underhålla Därför kan det vara motiverat att använda rekursion trots dess nackdelar. Preprocessorn Preprocessorn evaluerar speciella direktiv i koden innan koden kompileras. Rader med preprocessordirektiv börjar med en #. Preprocessorn utför inkludering av filer, villkorlig kompilering och expansion av makron. Rader med preprocessordirektiv kan förekomma var som helst i koden. 208 209 Filinkludering Inkludering av filer utförs med #include. Standardfiler Standardfiler anges inom < och > varefter preprocessorn söker på ett antal fördefinierade ställen. #include <tcp.h> Användarfiler Användarfiler anges inom " varefter preprocessorn letar i den aktuella katalogen. #include "list.h" #include "matrix.h" Filinkludering Raden med preprocessordirektivet byts ut mot en kopia av filen vilket kan vara av intresse om det finns beroenden mellan filer som inkluderas. Filinkluderingar kan vara nästlade, d.v.s filer som inkluderas kan själv inkludera filer. 210 211 Makron och konstanter Makron kan användas till att definiera konstanter och öka tydligheten och portabiliteten av kod. Ett makro definieras med #define. #define identifier token_string Preprocessorn byter ut alla förekomster av identifier mot token_string i koden. #define MAX_STR_LEN 50 #define EPS 2.2204e-16 #define EQ == Det finns inga begränsningar i vad som kan definieras som makron. Makron med argument #define identifier(identifier,, identifier) token_string Efter en deklaration #define max(x,y) ((x)>(y)? (x) : (y)) blir uttrycket c = max(a+1,b-1); expanderat av preprocessorn till c = ((a+1)>(b-1)? (a+1) : (b-1)); 212 213 2

Vanliga fel Utan parenteser #define SQ(x) x*x c = SQ(5 + 1); blir expanderat av preprocessorn till c = 5 + 1 * 5 + 1 ; /* == 11 och ej 36 */ Semikolon och lika med #define add = + #define A 3; c = b add A-5; blir expanderat av preprocessorn till c = b = + 3; -5; Fler vanliga fel Funktionsargument Vad blir nämligen egentligen detta? #define MAX(x,y) ((x) > (y)? (x) : (y)) int give_next() { static int d = 2; d++; return d;.. MAX(3, give_next()) 214 215 Makron i stdio.h int getchar(); int putchar(int c); Returnerar: c vid OK, annars EOF getchar läser ett tecken från tangentbordet. putchar skriver ett tecken till skärmen. getchar() och putchar() getchar() returnerar en int och putchar() tar en int som argument. I minnet så lagras en char som 1 byte och en int lagras oftast som 4 byte. Därför kan en int lagra alla värden som en char kan. Vi kan tänka oss char som en liten heltalstyp och int som en stor teckentyp. Vi kan alltså lagra tecken i int lika gärna som i char. 216 217 double_out.c /* i stdio.h finns raden #define EOF (-1) */ int c; while ((c = getchar())!= EOF) { return 0; capitalize.c int c; while ((c = getchar())!= EOF) { if (c >= a && c <= z ) putchar( A + c - a ); else return 0; 218 219 3

Makron i ctype.h Makron för teckenhantering. #include <ctype.h> int isalpha(int c); 0 om c är en bokstav int isupper(int c); 0 om c är en stor bokstav int islower(int c); 0 om c är en liten bokstav int isdigit(int c); 0 om c är en siffra int isspace(int c); 0 om c är ett vitt tecken int toupper(int c); motsvarande stora bokstav eller c int tolower(int c); motsvarande lilla bokstav eller c Skriva eller läsa enskilda tecken Motsvarigheten till getchar och putchar heter för filer getc och putc. int putc(int c, FILE *stream); Returnerar: värdet av c. EOF vid filslut eller fel. int getc(file *stream); Returnerar: Nästa tecken från strömmen. EOF vid filslut eller fel. Dessa anrop sker genom makron. Det finns också litet långsammare funktionsvarianter av dessa som heter fputc och fgetc. 220 221 Exempel Observera att dessa två satser är ekvivalenta och att man inte kan öppna eller stänga stdout. fprintf(stdout, "Detta skrivs till skärm\n"): printf("detta skrivs till skärm\n"): Liksom att dessa tre satser är ekvivalenta. putc( a, stdout); fputc( a, stdout); putchar( a ); Villkorlig kompilering #if constant_integer_expression #ifdef identifier #ifndef identifier #elif #else Portabel kod Debug utskrifter Undvika att inkludera filer flera gånger 222 223 Villkorlig kompilering Debugutskrifter: #define DEBUG 1 #if DEBUG printf("debug: a = %d\n", a); eller #define DEBUG #ifdef DEBUG printf("debug: a = %d\n", a); Bryta upp kod i moduler Hålla samman relaterade funktioner Lättare felsökning Lättare att bygga ut. 224 225 4

Headerfiler: Filinkluderingar Typdeklarationer Definitioner, makron Funktionsprototyper Källkodsfil: Filinkluderingar Funktioner 226 temp.h #ifndef TEMP_H #define TEMP_H #include <stdlib.h> #define CK_ADJUST 273.15 #define CF_SCALE 1.8 #define CF_ADJUST 32 typedef double celsius; typedef double kelvin; typedef double farenheit; kelvin celsius_to_kelvin (celsius); farenheit celsius_to_farenheit (celsius); celsius farenheit_to_celsius (farenheit); kelvin farenheit_to_kelvin (farenheit); celsius kelvin_to_celsius (kelvin); farenheit kelvin_to_farenheit (kelvin); 227 temp.c #include temp.h kelvin celsius_to_kelvin(celsius c) { return (kelvin)(c - CK_ADJUST); farenheit celsius_to_farenheit(celsius c) { return (farenheit)((c * CF_SCALE) + CF_ADJUST); celsius farenheit_to_celsius(farenheit f) { return (celsius)((f - CF_ADJUST)/CF_SCALE); 228 Assertions Header-filen assert.h innehåller makrot assert(). Det är bra programmeringsvana att använda sig av assert() för att kontrollera att argumenten till en funktion är korrekta. #include <assert.h> double div (double a, double b) { assert(b!= 0); return a/b; div(2, 0); /* assertion will fail */ 229 Assertions Om ett argument till assert() är falskt, kommer programmet att skriva ut ett felmeddelande, t.ex. Assertion failed on line 23 och programmet kommer att avslutas. Assertions är enkla att skriva och gör källkoden robustare. Andra läsare av källkoden kan dessutom lättare förstå innehållet. Använd assert()!!! 230 5