递归函数的执行次数
#include<stdio.h>
void fun(int a[], int n, int k)
{
int i;
if (k == n - 1)
{
for (i = 0; i < n; i++)
{
printf("%5d", a[i]);
}
}
else
{
for (i = k; i < n; i++)
a[i] = a[i] + i * i;
fun(a, n, k + 1);
}
}
{
int i;
if (k == n - 1)
{
for (i = 0; i < n; i++)
{
printf("%5d", a[i]);
}
}
else
{
for (i = k; i < n; i++)
a[i] = a[i] + i * i;
fun(a, n, k + 1);
}
}
int main()
{
int b[10] = { 1,2,3,4,5,6,7,8,9,10 };
int m, h;
int *p = &m;
*p = 10;
fun(b, *p,0);
return 0;
}
{
int b[10] = { 1,2,3,4,5,6,7,8,9,10 };
int m, h;
int *p = &m;
*p = 10;
fun(b, *p,0);
return 0;
}
先考虑第一种情况,k==n-1时,执行时间为n
其他情况,执行次数为n-k次,在k到n之间执行,次数为n-k,执行时间为T(n,k+1),而当k=n-1时,结束程序
所以,时间复杂度是1到n-1,即[n(n+1)]/2 - 2+n = n^2/2+3n/2-1 =>O(n^2)
计算平均时间复杂度
int fun(int a[],int n ,int i)
{
int j ,max = a[0];
for(int j =1; j<i-1;j++) //T = i-1
{
if(a[j]>max)
max=a[j];
return max;
}
}
{
int j ,max = a[0];
for(int j =1; j<i-1;j++) //T = i-1
{
if(a[j]>max)
max=a[j];
return max;
}
}
程序执行次数为i-1次,时间是1到n-1,时间复杂度为S(n-1) = (n-1)n/2
所以,平均时间复杂度为: S(n-1)/n = n-1/2 , 即时间复杂度为O(n)