vad händer vid ett funktionsanrop

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