C-språket/H98/lect9.doc/GP VAD HÄNDER VID ETT FUNKTIONSANROP? 1. De aktuella parametrarna beräknas en aktuell parameter är ett uttryck ordningsföljden enligt vilken parametrarnas värden beräknas är obestämd 2. De aktuella parametrarna anpassa och överförs till funktionen automatisk datatypkonvertering till de formella parametrarnas datatyp 3. De aktuella parametrarna tas emot av den anropande funktionen och tilldelas till de formella parametrarna 4. Satser i funktionens kropp exekveras 5. Retur från funktionen sker Ex. Skapa en egen sinusfunktion från programmet som beräknar sinusfunktionens värde ur Taylor-serien #include <stdio.h> #include <math.h> #define eps 0.00000000001 int main() { float x,term,sum; int i; printf("Ge ett värde för x: "); scanf("%f",&x); term=x; sum=0; i=1; do { sum=sum+term; i=i+2; term = -term*x*x/(i*(i-1)); } while (fabs(term)>eps); printf("sin(%f) enligt eget program = %.10f\n",x,sum); printf("sin(%f) enligt standardfunktion = %.10f\n",x,sin(x)); } C-språket/H98/lect9.doc/GP Samma program med egen sinusfunktion sin2(x) #include <stdio.h> #include <math.h> #define eps 0.00000000001 double sin2(double x); /* deklaration av sin2(x) */ int main() { double x; printf("Ge ett värde för x: "); scanf("%lf",&x); printf("sin(%f) enligt eget program = %.10f\n",x,sin2(x)); printf("sin(%f) enligt standardfunktion = %.10f\n",x,sin(x)); } double sin2(double x) /* definition av sin2(x) */ { double sum,term; int i; term=x; sum=0; i=1; do { sum=sum+term; i=i+2; term = -term*x*x/(i*(i-1)); } while (fabs(term)>eps); return sum; } 2 C-språket/H98/lect9.doc/GP 3 REKURSION En funktion som anropar sig själv. Exempel. Fakultetsfunktionen n! = 1*2*3*…*(n-1)*n 5! = 1*2*3*4*5 definition: 0! = 1 t.ex 5! Kan beräknas ur 4! med 5! = 4! * 5 = 5 * 4! Rekursiv definition på fakultetsfunktionen n! = 1 om n=0 n! = n*(n-1)! om n>0 Definitionen är rekursiv, eftersom faktultetsfunktionen utnyttjas av definitionen Ex. Skriv ett C-program som beräknar n! med en rekursiv funktion #include <stdio.h> long fak(int n); /* deklaration av n! */ int main() { int tal; printf("Ge ett heltal: "); scanf("%d",&tal); printf("%d! = %ld\n",tal,fak(tal)); } long fak(int n) { if (n==0) return 1; else if (n>0) return n*fak(n-1); /* rekursivt anrop av fak */ else return -1; /* returneras för n<0 */ } C-språket/H98/lect9.doc/GP Rekursion är implicit ("gömd") upprepning. En rekursiv funktion har därför alltid en iterativ motsvarighet (iteration betyder explicit uttrycklig - upprepning) iterativ motsvarighet till den rekursiva funktionen fak long fak(int n) { int i; long prod=1; if (n==0) return 1; else if (n>0) { for (i=1;i<=n;i++) prod *= i; /* upprepning! */ return prod; } else return -1; /* om n<0 */ } 4