函数和递归

目录

设计函数

函数调用的本质

递归:

汉诺塔

数组作为函数参数

函数练习


设计函数

1.函数命名法要采用传统命名方法

2.能拆成函数的尽量拆成函数

3.函数设计时,尽可能考虑健壮性扩展性

函数调用关系:  调用者和被调用者

int main()

{

        printf("%d",getMonthDays());

}

getMonthDays----在此处是被调用者

main函数至整个程序的入口,只能是调用者

注:     

        函数不支持在函数内部再定义,但支持函数嵌套调用。

函数名  ----函数入口地址

pc          //program couter        ---程序计数器

             // 先入后出FILO (First In Last Out)

            数据结构   -----(表示数组组织形式)
 

函数调用的本质

        实际是利用栈的结构        ---先进后出,保证了函数可以层层嵌套调用。

C语言角度的栈:

                1.本质是一块内存空间。

                2.只是按照 栈  这种数据结构 来处理数据。

C语言程序:                //把区域划分成5个区域

        栈                                                     默认8M可以修改

        堆

        字符串常量区

        静态区(全局区)

        代码区

递归

递归思路:

        要求问题n---依赖于问题n-1的解决

汉诺塔

过程分析:首先创建hanoi函数,返回值是打印具体变换过程,则返回无(void),打印部分的交给内部引用的move函数,move(int pole1,int pole2)函数指从pole1 移动到pole2,同样它也是一个起点一个目标点,这才是本身参数的意义,是指一个起点移到一个目标点,hanoi(int n,int A,int B,int C),分成n-1和n两部分,n-1可以分成n-2和1,直到n=1;这个过程就体现了递归思想,注意  hanoi(n个盘子,起始柱,辅助柱,目标柱)传参的abc的意义,而不是abc数字本身。

include <stdio.h>
  2 
  3 void move(int pole1,int pole2)
  4 {                                                                                                                                                                    
  5     printf("%c --> %c \n",pole1,pole2);
  6 }
  7 
  8               //起始   辅助   目标 
  9 void hanoi(int n,int A,int B,int C)
 10 {
 11     if (n == 1)
 12     {
 13         move(A,C);
 14     }else
 15     {
 16         hanoi(n-1,A,C,B);
 17         move(A,C);
 18         hanoi(n-1,B,A,C);
 19     }
 20 
 21 }
 22 
 23 
 24 int main(void)
 25 {
 26     int n;
 27     scanf("%d",&n);
 28 
 29     hanoi(n,'A','B','C');
 30     return 0;
 31 }
~       

结果:打印变换过程

数组作为函数参数

传变量int a[ ] 但编译器最终理解的是int *a,所以实际上最正确的写法应该是 在函数传参部分写    int *a:   -------int  FindMax(int *a,int len){}

应用如下:

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int FindMax(int a[],int len)//还没学到指针,才写的int a[]
  5 {
  6     int i = 0;
  7     int max = a[0];
  8     for(i=1;i<len;i++)
  9     {
 10         max = max>a[i]?max:a[i];
 11     }
 12 
 13     return max;
 14 }
 15 
 16 int main()
 17 {
 18     int a[] = {1,2,3,4,5,6,7,8,9};
 19     int ret ;
 20 
 21     ret = Findmax(a,9);
 22 
 23     printf("the max num is %d\n",ret);                                                                                                                               
 24     return 0;
 25 }
~      

函数练习

练习:实现数组的逆序(用函数)

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 void arrayRes(int a[],int len)
  5 {
  6     int i,temp;
  7 
  8     for(i=0;i<len/2;i++)  //注意这里不要写成i<len  这样还是回到原来的样子,换两遍又换回来了                                                                                                                                  
  9     {
 10         temp = a[i];
 11         a[i] = a[len-1-i];
 12         a[len-1-i] = temp;
 13     }
 14 
 15     for(i=0;i<len;i++)
 16     {
 17         printf("a[%d] = %d\n",i,a[i]);
 18     }
 19 }
 20 
 21 int main()
 22 {
 23     int a[] = {1,2,3,4,5,6,7,8,9};
 24     int len = sizeof(a)/sizeof(a[0]);
 25 
 26     arrayRes(a,len);
 27 
 28     return 0;
 29 }
~                                                                                                                                                                        
~       

练习:插入排序(用函数)

 1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 void arrayRank(int a[],int len)
  5 {
  6     int j,i,temp;
  7 
  8     for(i=1;i<len;i++)                                                                                                                                               
  9     {
 10         temp = a[i];
 11         j = i;
 12         while(j>0&&temp<a[j-1])
 13         {
 14             a[j] = a[j-1];
 15             j--;
 16         }
 17         a[j] = temp;
 18     }
 19     return;
 20 }
 21 
 22 
 23 int main()
 24 {
 25     int a[] = {9,8,7,6,5,4,3,2,1};
 26     int len = sizeof(a)/sizeof(a[0]);
 27     int i;
 28     arrayRank(a,len);
 29 
 30     for(i=0;i<len;i++)
 31     {
 32         printf("a[%d] = %d\n",i,a[i]);
 33     }
 34     return 0;
 35 }

练习:完成查找函数

#include <stdio.h>
#include <string.h>

int arrayFind(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;
	}

}

int main()
{	int a[] = {1,2,3,4,5,6,7,8,9};
	int len = sizeof(a)/sizeof(a[0]);
	int ret,n;
	printf("Input n:\n");
	scanf("%d",&n);
	
	ret = arrayFind(a,len,n);

	if(ret==-1)
	{
		printf("not find\n");
	}else
	{
		printf("the num is a[%d] = %d\n",ret,a[ret]);
	}


	return 0;
}

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值