函数02 day11
五:嵌套调用(递归)
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<stdio.h>//斐波那契数列 前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 <stdio.h>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<stdio.h>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<stdio.h>//逆序void antiArraay(int a[],int len)
{int i;int t;for(i=0;i<len/2;i++){t = a[len-i-1];a[len-i-1] = a[i];a[i] = t;}
}void printArray(int a[],int len)
{int i;for(i=0;i<len;i++){printf("%d ",a[i]);}putchar('\n');
}int main(int argc, const char *argv[])
{int a[10] = {1,2,3,4,5,6,7,8,9,10};int len = sizeof(a)/sizeof(a[0]);printArray(a,len);antiArraay(a,len);printArray(a,len);return 0;
void choseArraay(int a[],int len)//选择排序
{int t;for(int i=0;i<len-1;i++){for(int j=i+1;j<len;j++){if(a[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 0while(src[i] != '\0'){dest[i] = src[i];i++;}dest[i] = '\0';
#endifwhile(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<stdio.h>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<stdio.h>
#include<string.h>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;
}