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.在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出

猜你喜欢

转载自blog.csdn.net/zhangfei5354/article/details/83753548