一、函数的递归调用
1. 直接递归调用
void f1()
{
f1()
}
int main(void)
{
f1();
return 0;
}
注:递归调用需要一个结束的条件,要不然会让程序崩溃陷入死循环,原因是函数每次调用都需
要往栈里返回地址,栈的空间是有限的,递归调用会很占内存,一次递归需要一次空间分配,能用
循环用循环;
2. 间接递归调用
void f1()
{
f2();
}
void f2()
{
f1();
}
int main(void)
{
f1();
return 0;
}
3. 数组作为函数参数传递
void shuzu(int a[],int len)
{
.
.
.
}
int main(void)
{
int a[]={...};
int len=sizeof(a)/sizeog(a[0]);
shuzu(a,len);
}
(1) 传递两个参数:数组的数组名和数组元素的个数
(2)当使用数组作为参数传递时,需要传递数组的地址名,即数组首元素的地址,即为指针传
递,能在被调函数中修改主调函数,并且这样的传递方式,可以提高效率。
二、练习
1.逆序
void reverse(int a[],int len)
{
int i,tmp;
for(i = 0;i < len / 2;++i)
{
tmp = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = tmp;
}
}
2.选择排序
void choiceSort(int a[],int len)
{
int i,j;
for(i = 0;i < len - 1;++i)
{
for(j = i + 1;j < len;++j )
{
int t;
if(a[i] > a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
3.冒泡排序
void bobbleSort(int a[],int len)
{
int i,j;
int tmp;
for(i = len -1;i > 0 ;--i)
{
for(j = 0;j < i;++j)
{
if(a[j] > a[j+1])
{
tmp = a[j];
a[j] = a[j +1];
a[j + 1] = tmp;
}
}
}
}
4.插入法排序
void sertSort(int a[],int len)
{
int i,j;
for(i = 1;i < len;++i)
{
int t = a[i];
int j = i;
while(j > 0 && a[j - 1] > t)
{
a[j] = a[j - 1];
--j;
}
a[j] = t;
}
}
5.二分查找
int binaryFind(int a[],int len,int n)
{
int begin = 0;
int end = len - 1;
int mid;
while(begin <= end)
{
mid = (begin + end) / 2;
if(a[mid] > n)
{
end = mid - 1;
}
else if(a[mid] < n)
{
begin = mid + 1;
}
else
{
break;
}
}
if(begin <= end)
{
return mid;
}
else
{
return -1;
}
}
6.strcpy
void Strcpy(char desk[],char src[])
{
int i = 0;
while(src[i] != 0)
{
desk[i] = src[i];
++i;
}
desk[i] = 0;
}
7.strcat
void Strcat(char desk[],char src[])
{
int i = 0;
int j = 0;
while(desk [i] != 0)
{
++i;
}
while(src[j])
{
desk[i++] = src[j++];
}
desk[i] = 0;
}
8.strcmp
int Strcmp(char s1[],char s2[])
{
int i = 0;
while(s1[i] == s2[i] && s1[i] &&s2[i])
{
++i;
}
return s1[i] - s2[i];
}
9.字符串的逆序
void reveseStr(char s[])
{
int i = 0;
int len = Strlen(s);
for(i = 0; i < len / 2;++i )
{
char t;
t = s[i];
s[i] = s[len -i -1];
s[len -i- 1] = t;
}
}