1.直接递归
void func1
{
printf("func1-----\n");
func1();
}
2.间接递归
void func1()
{
printf("func1-----\n");
void func2();
func2();
}
void func2()
{
printf("func2-----\n");
}
3.递归是一种特殊的循环 //递归因为栈空间有限,即使没有结束条件,也不会死循环
int sum(int n)
{
if(n == 1)
{
return 1;
}else
{
return sum(n-1) + n;//递归思路:从后往前看,看向上一次操作,累次
}
}
int main(int argc, const char *argv[])
{
int n = 0;
scanf("%d",&n);
int ret = sum(n);
printf("%d\n",ret);
int fb(int n)//斐波那契数列 第N项的值
{
if(n == 1||n == 2)
{
return 1;
}else
{
return fb(n-2) + fb(n-1);
}
}
#include //斐波那契数列 前N项的值
int fb(int n)
{
if(n == 1||n == 2)
{
return 1;
}else
{
return fb(n-2) + fb(n-1);
}
}
int sum(int n)
{
if(n == 1)
{
return 1;
}else
{
return fb(n) + sum(n-1);
}
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d",&n);
printf("sum = %d\n",sum(n));
return 0;
}
4.汉罗塔
#include
void move(int n ,int pole1,int pole2)
{
static int step = 1;
printf("%03d:[disk %d] : %c --> %c\n",step++,n,pole1,pole2);
}
//起始柱 辅助柱 目标柱
void hanoi(int n, int A, int B, int C)
{
if (1==n)
{
move(n,A,C);
}else
{
hanoi(n-1,A,C,B);//n-1 先挪走
puts("-------");
move(n,A,C); // 将第n个 挪到 目标柱
puts("-------");
hanoi(n-1,B,A,C);
}
}
//n = 3;
//hanoi(2,'A','C','B')
// | --------------------> hanoi(1,'A','B','C')
// move(2,'A','B'); [2:A->B]
// |----------------------->move(1,'A','C') [1:A->C]
//move(3,'A','C'); -----> [3:A->C]
//hanoi(2,'B','A','C');
int main(void)
{
int n = 0;
printf("Input numbers of disk: ");
scanf("%d",&n);
hanoi(n,'A','B','C');
return 0;
}
1.数组元素作为函数参数:因为数组元素本身就是一个 变量,所以函数的形参,设计为对应类型的一个变量即可实参,传递对应的数组元素即可
void printArray(int b)
{
}
int a[10] = {1,2,3,4,5};
printArray(a[3]);
2.数组本身作为函数参数:数组传递,传的不是整个数组,而是首个数组元素的位置
注意:一维整型数组做函数参数
形参 数组形式 数组长度
实参 数组名 数组长度
void printArray(int a[],int len)//int a[]//不用写范围//本质是指针
{
int i;
for(i=0;i<len;i++)
{
printf("%d\n",a[i]);
}
}
int main(int argc, const char *argv[])
{
int a[10] = {1,2,3,4,5};
int len = sizeof(a)/sizeof(a[0]);
printArray(a,len);
return 0;
}
#include
int findMax(int a[],int len)
{
int i;
int max = a[0];
for(i=1;i<len;i++)
{
if(a[i] > max)
{
max = a[i];
}
}
return max;
}
int main(int argc, const char *argv[])
{
int a[10] = {1,2,3,4,5};
int len = sizeof(a)/sizeof(a[0]);
printf("max = %d\n",findMax(a,len));
return 0;
}
#include//逆序
void antiArraay(int a[],int len)
{
int i;
int t;
for(i=0;i
void choseArraay(int a[],int len)//选择排序
{
int t;
for(int i=0;i a[j])
{
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
}
}
void boBoArraay(int a[],int len)//冒泡
{
int t;
for(int i=1;i<len;i++)
{
for(int j=0;j<len-i;j++)
{
if(a[j] > a[j+1])
{
t = a[j+1];
a[j+1] = a[j];
a[j] = t;
}
}
}
}
void insertArraay(int a[],int len)//插入
{
int t;
int j;
for(int i=0;i<len;i++)
{
t = a[i];
j = i;
while(j>0 && a[j-1]>t)
{
a[j] = a[j-1];
j--;
}
a[j] = t;
}
}
int briFind(int a[],int len,int n)//二分查找
{
int begin = 0;
int end = len-1;
int mid = 0;
int ret = -1;
while(begin <= end)
{
int mid = (begin + end)/2;
if(a[mid] > n)
{
end = mid - 1;
}else if(a[mid] < n)
{
begin = mid + 1;
}else
{
ret = mid;
break;
}
}
return ret;
}
int n;
scanf("%d",&n);
((briFind(a,len,n) >= 0))?printf("found\n"):printf("not found\n");
1.字符型一维数组做函数参数
形参 数组形式
实参 数组名
原因:因为字符型数组中主要存放字符串数据而字符串数据,本身有结束标志
void Puts(char str[])
{
int i = 0;
while(str[i] != '\0')
{
putchar(str[i]);
i++;
}
putchar('\n');
}
int main(int argc, const char *argv[])
{
char s[20] = "hello";
Puts(s);
return 0;
}
2.strlen
int Strlen(char str[])
{
int i = 0;
while(str[i] != '\0')
{
i++;
}
return i;
}
3.strcpy
void Strcpy(char dest[],char src[])
{
int i = 0;
#if 0
while(src[i] != '\0')
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';
#endif
while(dest[i] = src[i])//src到最后'\0'给到dest空位,正好也作为while的条件判断
{
++i;
}
}
4.strcmp
int Strcmp(char s1[],char s2[])//strcmp
{
int i = 0;
while(s1[i] != '\0' && s2[i] != '\0')
{
if (s1[i] != s2[i])
{
break;
}
i++;
}
return s1[i] - s2[i];
}
1.整型二维数组作为函数参数
形参 二维数组形式 行数的形参
实参 二维数组数组名 二维数组行数
void printArray(int a[][4],int row)
2.打印二维数组
#include
void printArray(int a[][4],int row)
{
int i = 0;
int j = 0;
for(i=0;i<row;++i)
{
for(j=0;j<4;++j)
{
printf("%3d ",a[i][j]);
}
putchar('\n');
}
}
int main(int argc, const char *argv[])
{
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int row = sizeof(a)/sizeof(a[0]);
printArray(a,row);
return 0;
}
3.scanf
void scanfArray(int a[][4],int row)
{
for(int i=0;i<row;i++)
{
for(int j =0;j<4;j++)
{
int n;
scanf("%d",&n);
a[i][j] = n;
}
}
}
4.max
int findMax(int a[][4],int row)
{
int max = a[0][0];
for(int i=0;i<row;i++)
{
for(int j =0;j<4;j++)
{
if(max < a[i][j])
{
max = a[i][j];
}
}
}
return max;
}
1.字符型二维数组做函数参数
形参 二维数组的形式 行数的形参
实参 二维数组数组名 行数
数组类型不能作为函数返回值
void printfStr(char s[3][10],int row)
{
for(int i=0;i<row;i++)
{
puts(s[i]);
}
}
2.scanf
void scanfStr(char s[][10],int row)
{
for(int i=0;i<row;i++)
{
scanf("%s",s[i]);
}
}
3.找最大字符串
void maxString(char s[][10],int row,char max[10])//可以在形参中设置max返回
{
strcpy(max,s[0]);
for(int i=1;i<row;i++)
{
if(strcmp(s[i],max) > 0)
{
strcpy(max,s[i]);
}
}
}
maxString(s,row,max);//只能通过这样返回,不能直接printf一步到位
printf("max_char = %s\n",max);
int maxString(char s[][10],int row)//标准
{
char max[10];
strcpy(max,s[0]);
int ret = 0;
for(int i=1;i<row;i++)
{
if(strcmp(s[i],max) > 0)
{
strcpy(max,s[i]);
ret = i;
}
}
return ret;
}
printf("max_char = %s\n",s[maxString(s,row)]);
#include
#include
int Strcmp(char s1[],char s2[])//strcmp
{
int i = 0;
while(s1[i] != '\0' && s2[i] != '\0')
{
if (s1[i] != s2[i])
{
break;
}
i++;
}
return s1[i] - s2[i];
}
void chosenArr(char s[][10],int row)
{
for(int i=0;i<row-1;i++)
{
for(int j=i+1;j<row;j++)
{
if(Strcmp(s[i],s[j]) > 0)
{
char t[10];
strcpy(t,s[j]);
strcpy(s[j],s[i]);
strcpy(s[i],t);
}
}
}
}
void boArr(char s[][10],int row)
{
for(int i=1;i<row;i++)
{
for(int j=0;j<row-1;j++)
{
if(Strcmp(s[j],s[j+1]) > 0)
{
char t[10];
strcpy(t,s[j+1]);
strcpy(s[j+1],s[j]);
strcpy(s[j],t);
}
}
}
}
void insertArr(char s[][10],int row)
{
char t[10];
for(int i=0;i<row;i++)
{
strcpy(t,s[i]);
int j = i;
while(j>0 && s[j-1] > t)
{
strcpy(s[j],s[j-1]);
j--;
}
strcpy(s[j],t);
}
}
void printfStr(char s[][10],int row)
{
for(int i=0;i<row;i++)
{
puts(s[i]);
}
}
int main(int argc, const char *argv[])
{
char s[][10] = {"hello","world","china"};
int row = sizeof(s)/sizeof(s[0]);
printfStr(s,row);
//chosenArr(s,row);
//boArr(s,row);
insertArr(s,row);
printf("----------------------\n");
printfStr(s,row);
return 0;
}