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