Anders Sjögren Funktioner något in och något annat ut.

Slides:



Advertisements
Liknande presentationer
Array Skriv ett program som frågar följande: ”Hur många tal vill du mata in?” användaren matat in ett tal t.ex n. då frågar programmet n ggr följande.
Advertisements

void hittaMax(int tal[], int antal, int *pmax) { int i; ??=tal[0]; for(i=1;i??) ??=tal[i]; } int main() { int v[]={1,2,3,4,2}; int.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Datavetenskap för teknisk kemi 10p, moment 1
Programstruktur: C för enchipsdatorer
Funktioner och programorganisation
2D1311 Programmeringsteknik med PBL
De fundamentala datatyperna
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Algoritmer och datastrukturer
Föreläsning 4 Python: mera om funktioner och parametrar
C-programmering ID120V William Sandqvist Länkad lista
Välkommen Vahid Mosavat
Programmeringsteknik K och Media
Programmeringsteknik för K och Media
Programkodens uppbyggnad
Grundläggande programmering
Föreläsning 4 Python: Definiering av egna funktioner Parametrar
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Repetition inför slutprovet
Ali Ghodsi Variabler En variabel är en sorts behållare som man kan placera data i Man måste ange typ och namn för alla variabler.
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
int res2=Math.max(tal1,tal2);
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: Trådprogrammering i Java - Avbrott (”interrupts”) - Metoden join() -
William Sandqvist C:s minnesmodell.
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Anders Sjögren Mer om datatyper. Anders Sjögren const det finns ett elegantare sätt att skapa konstanter i C än sättet med makro som vi använt tidigare.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser -Att definiera egna klasser -Klassvariabler -Klassmetoder.
Modulär programutveckling
Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Namnrum, räckvidd och rekursion Linda Mannila
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Java paket och jar-filer
Anders Sjögren ANSI - standard ?. Anders Sjögren ANSI - standard ? Om man skriver ett bra C-program och kompilerar fram ”exe”-filen så vore det ju trevligt.
INTRODUKTION TILL PROGRAMMERING
Anders Sjögren Bitfält exempel Nu kommer ett förbättrat program. Det är funktions- uppdelat och kan lägga till poster som lagras på fil.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Problemlösningsmetodik
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Föreläsning 4 programmeringsteknik och Matlab 2D1312/ 2D1305
F6 - Pekare 1 Programmeringsteknik, 4p vt-00 Pekare & adresser Alla variabler är knutna till en viss adress i minnet int i; adressen till denna fås med.
Anders Sjögren Deklarationsområde och funktioner.
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Gruppövning 0.
William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på.
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
Föreläsning4 Repetition slingor Metoder. while-sats består av följande delar: 1. while 2. Villkor-sats (condition) 3. uttryck (statement) while-sats int.
Anders Sjögren Mer om datatyper. Anders Sjögren const det finns ett elegantare sätt att skapa konstanter i C än sättet med makro som vi använt tidigare.
Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN
Program indata ? utdata 1/20 Vahid Mosavat, Nada, KTH.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts. Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper.
Språket för inbyggda system. C:s verktygslåda är välfylld! William Sandqvist
Anders Sjögren Modulär programutveckling. Anders Sjögren Ett programmeringsprojekt, flera personer utvecklar ett program Vi ska utveckla ett ränteberäkningsprogram.
Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
KPP053, HT2015 MATLAB, Föreläsning 4
Python.
Presentationens avskrift:

Anders Sjögren Funktioner något in och något annat ut

Anders Sjögren Funktioner ger en klarare bild tyvärr så klarar inte människan att ”hålla hur många bollar (hattar) i luften som helst” förmågan att se samband och konsekvenser mellan samtidiga skeénden är begränsad. Fundera t ex på hur många tal du kan memorera om någon räknar upp dem för dig. kanske klarar du 7 st men ofta hamnar man på 3-4 st. med funktioner kan man dela upp sin källkod i del- (under-) program för att få överblick, se samband och konsekvens varje delprogram ( funktion ) löser en avgränsad deluppgift

Anders Sjögren Funktioner Exempel nu kör vi ränteberäknings- programmet igen. De här bilderna har du sett förut!

Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return 0; } många satser efter varandra gör programmet oöverskådligt - dela upp koden i funktioner

Anders Sjögren Att konstruera en funktion Funktionskonstruktion. Dela upp programmet m h a del- (under-) program.

Anders Sjögren Att konstruera en funktion /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return 0; } Klipp ut! Det är denna del av programmet som skapar tabellen - en avgränsad deluppgift.

Anders Sjögren Att konstruera en funktion /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); return 0; } OK!

Anders Sjögren Att konstruera en funktion printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } Definiera den nya funktionen! klistra in ! Denna kod klistras in sist i källkodsfilen, efter ”stommen” stomme

Anders Sjögren Att konstruera en funktion void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Definiera den nya funktionen! En funktion har samma uppbyggnad som main(), som ju också är en funktion. lägg till! ändra!

Anders Sjögren Funktionens delar void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Definiera den nya funktionen! funktionens returtyp - utdatatyp funktionens namn funktionens formella parametrar (argument) - indata funktionsprototyp, funktionshuvud

Anders Sjögren Funktionens delar void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Definiera den nya funktionen! funktionens egen variabel, okänd utanför funktions- kroppen indatavariablerna, som bara är kända i funk- tionen används i funktionen

Anders Sjögren Att konstruera en funktion /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); TabellPaSkarmen( ANTAL_AR, kapital ); return 0; } lägg till funktions- deklaration och funktions- anrop här skall funktions- definitionen in

Anders Sjögren Att konstruera en funktion här skall funktions- definitionen in /* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intar, antalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } ändradetta, man kan nu ange antal år vid exekveringen.

Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler en översikts- bild av hela programmet /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; }

Anders Sjögren Att konstruera en funktion en översiktsbild av hela program- met /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } stommen, som ju också är en funktion. funktionen

Anders Sjögren Att konstruera en funktion en översiktsbild av hela program- met /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } funktionsdeklaration, för att kompilatorn skall kunna kontrollera att man använder funktionen rätt funktionsdefinition

Anders Sjögren Att konstruera en funktion /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Å va bra! Nu tar jag en hatt åt gången!

Anders Sjögren Ett C-program byggs upp av satser i sekvens styrande satser –iteration –selektion funktioner flera filer (så småningom) /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; }

Anders Sjögren Funktionsanrop Hur anropas en funktion? Vad händer då en funktion anropas och exekveras?

Anders Sjögren Funktionsanrop exempel /* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; }

Anders Sjögren Vad händer då man definierar ett minne ? /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; }

Anders Sjögren Datorns primärminne main() exekveras Maskinkod programmet Heap Stack Bytes antalAr=1 kapital=100 main() tid int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ? "); printf("(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } main’s ”egna” variabler skapas på stacken - aktiveringspost

Anders Sjögren Hur måste TabellPaSkarmen() se ut ? void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ? "); printf("(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ? "); printf("(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } funktionen anropas, (aktuella parametrar) dessa variabelnamn kan vara lika men behöver inte vara det.

Anders Sjögren Datorns primärminne TabellPaSkarmen() exekveras Maskinkod programmet Heap Stack Bytes antalAr=1 kapital=100 antalAr=1 kapital=100 main() ar=?? kapital=100 tidTabellPaSkarmen() antalAr=1 void TabellPaSkarmen(int antalAr, float kapital) { int ar ; void TabellPaSkarmen(int antalAr, float kapital) { int ar ; de aktuella para- metrarna anpassas och kopieras till funktionens formella parametrar

Anders Sjögren antalAr=1 kapital=100 ar=2 kapital=108.5 antalAr=1 Datorns primärminne TabellPaSkarmen() exekveras Maskinkod programmet Heap StackBytes tidTabellPaSkarmmen() for ( ar = 1; ar <= antalAr; ar++ ) kapital = kapital * ( 1 + RANTESATS/100 ); for ( ar = 1; ar <= antalAr; ar++ ) kapital = kapital * ( 1 + RANTESATS/100 ); antalAr=1 kapital=100 antalAr=1 kapital=100 ar=?? kapital=100 antalAr=1 kapital=100 ar=1 kapital=108.5 antalAr=1 main()main() satserna i funktionen utförs

Anders Sjögren Datorns primärminne TabellPaSkarmen() dör main() dör - exekvering slut tid antalAr=1 kapital=100 main() TabellPaSkarmen() Maskinkod programmet Heap StackBytes antalAr=1 kapital=100 ar=2 kapital=108.5 antalAr=1 main()

Anders Sjögren Värdeöverföring Talen 1 och 100 har värdeöverförts, kopierats in i funktionen TabellPaSkarmen() Att nu förändra kopian ändrar inte på originalet TabellPaSkarmen() main() antalAr=1 kapital=100 ar=?? kapital=100 antalAr=1

Anders Sjögren Rekursion en funktion anropar sig själv

Anders Sjögren Rekursion n-fakultet, ett klassiskt exempel AaBbCcDdEeFfGgHhIiJjKkLlMmNn 0! = 1 1! = 1 2! = 1 · 2 = 2 3! = 1 · 2 · 3 = n! = 1 · 2 ·... (n-1) · n

Anders Sjögren Rekursion n-fakultet, ett klassiskt exempel #include int nfak( int ) ; int main( void ) { int fak, svar ; printf( "Ge fakultet --> " ); scanf("%d", &fak); svar = nfak(fak); printf("\nSvar: %d! = %d ", fak, svar ); return 0; } int nfak( int n ) { if (n<=0) return (1); else return ( n * nfak( n-1)); } anropar sig själv med n-1 slut NFAK1.EXE

Anders Sjögren Vad är det som händer? Stack Bytes Heap tid primärminnet main() fak3 fak=3, svar=?

Anders Sjögren Vad är det som händer? Stack Bytes Heap tid main()main() n=3 nfak(3) fak=3, svar=? 3 3

Anders Sjögren Vad är det som händer? Stack Bytes Heap tid main()main() n=3 nfak(3) main() nfak(3) n=2 nfak(2) fak=3, svar=? Heap 2 2

Anders Sjögren Vad är det som händer? Stack Bytes Heap tid main()main() n=3 nfak(3) main() nfak(3) n=2 nfak(2) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) fak=3, svar=? Heap 1 1

Anders Sjögren Vad är det som händer? Bytes tid main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) fak=3, svar=?

Anders Sjögren Vad är det som händer? Bytes tid main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) fak=3, svar=? Heap 0

Anders Sjögren Vad är det som händer? Bytes tid main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) 1 fak=3, svar=?

Anders Sjögren Vad är det som händer? Bytes tid main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) main() n=3 nfak(3) n=2 nfak(2) n=1 1 1 fak=3, svar=? 11

Anders Sjögren Vad är det som händer? Bytes tid main() main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) main() n=3 nfak(3) n=2 nfak(2) n=1 1 1 n=3 nfak(3) n=2 nfak(2) 2 fak=3, svar=? 21

Anders Sjögren Vad är det som händer? Bytes tid main() main() main() n=3 nfak(3) n=2 nfak(2) n=1 1 n=3 nfak(3) n=2 nfak(2) fak=3, svar=? 2 n=3 nfak(3) 6 32

Anders Sjögren Vad är det som händer? Bytes tid main() main() main() 32 n=3 nfak(3) n=2 nfak(2) 2 n=3 nfak(3) 6 fak=3, svar=6fak=3, svar=? program- slut 63

Anders Sjögren Rekursion n-fakultet, ett klassiskt exempel #include int nfak( int ) ; int main( void ) { int fak, svar ; printf( "Ge fakultet --> " ); scanf("%d", &fak); svar = nfak(fak); printf("\nSvar: %d! = %d ", fak, svar ); return 0; } int nfak( int n ) { if (n<=0) return (1); else return ( n * nfak( n-1)); } variabeln svar behövs inte NFAK1.EXE nfak(fak)

Anders Sjögren Rekursion tillämpning man kan använda rekursion för att vända på dataföljder #include void SkrivBaklanges( int ); int main( void ){ printf("Skriv tecken ( avsluta med Enter )--> "); SkrivBaklanges( getchar() ); return 0; } void SkrivBaklanges( int tecken){ if (tecken != '\n') { SkrivBaklanges( getchar() ); putchar( tecken ); } return ; } SKRIVBAK.EXE

Anders Sjögren Slut Övningsuppgift, se anteckningar