C语言基础 入门学习(十)

变量的相关内容

在这里插入图片描述
内存区域如下代码



/*
data  数据段  
text  指令段    ()main
bss    
bss段的作用是什么
*/
static int g_data1 = 10;//data段
static int g_data2 = 0;//bss
static int g_data3 ;//bss


int g_data4 = 10;//data段
int g_data5 = 0;//bss
int g_data6 ;//全局变量未初始化在编译时期放入common
//bss
int main()
{
static int g_data1 = 10;//data段
static int g_data2 = 0;//bss
static int g_data3 ;//bss


int g_data4 = 10;
int g_data5 = 0;
int g_data6 ;
return 0; 
}


递归

  int  Fun(int n)
    {
    	int age = 10;
    	for(int i = 1;i < n;i++)
    	{
    		age += 2;
    	}
    	return age;
    }

对于代码来说,纵向执行
对于程序员,横向执行 发生在栈上执行
临界条件 以及循环
//将循环改为递归

int Fun2(int n)
{
	int tmp;
	if(n == 1)//临界条件
	{
		tmp = 10;
		return tmp;
	}
	else//循环
	{
		tmp = Fun2(n-1) + 2;
		return tmp;
	}
}

//将斐波那契改为递归版本

int Fibo(int n)
{
	if(n == 1||n == 2)//
	{
		return 1;
	}
	else
	{
		return Fibo(n-1) +Fibo(n-2);
	}//通式 第n-2项与第n-1项的和是第n项
}
int main()
{
	printf("%d\n",Fibo(5));
	return 0;
}
int Hanno(int n,char a,char b,char c)  //将a借助b移动到c
{
	if(n == 1)//如果一个盘子 直接将a---》c
	{
		printf("%c ->%c\n",a,c);
	}
	else
	{
		Hanno(n-1,a,c,b);//将a借助c移动到b
		printf("%c -> %c\n",a,c);//再将a直接移动到c
		Hanno(n-1,b,a,c);//最后将b上的借助a移动到c
	}
}
int main()
{
	Hanno(64,'A','B','C');
	return 0;
}


int BinSearch(int *str,int start,int end,int key)//p为开始元素下标,q为最后的元素的下标,key为要查找的元素
{
	assert(*str != NULL);
	int mid = (start-end)/2 + start;
	if(start < end)
	{
		if(str[mid] == key)
		{
			return mid;
		}
		else if(str[mid] > key)
		{
			return BinSearch(str,start,mid-1,key);
		}
		else if(str[mid] < key)
		{
			return BinSearch(str,mid+1,end,key);
		}
	}

}
int main()
{
	int str[] = {1,2,3,4,5,6};
	int len = sizeof(str)/sizeof(str[0]);
	printf("%d\n",BinSearch(str,0,len-1,4));
	return 0;
}

分析递归和非递归的区别
1.递归算法是一种直接或者间接地调用自身的算法。
2.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
3.递归就是在过程或函数里调用自身。  
4.在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
5.递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
6.在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值