函数02 day11

五:嵌套调用(递归)

1.直接递归

void func1
{
	printf("func1-----\n");
	func1();
}

2.间接递归

void func1()
{
	printf("func1-----\n");
	void func2();
	func2();
}
void func2()
{
	printf("func2-----\n");
}

3.递归是一种特殊的循环 //递归因为栈空间有限,即使没有结束条件,也不会死循环

函数02 day11_第1张图片

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;
}

你可能感兴趣的:(linux)