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