递归描述:
递归是最简单的算法了,就是函数重复调用本身。当然我不可能这么敷衍了事,下面先看一下数据在内存中的存放。
栈区(stack):由编译器自动分配并释放,该区域一般存放函数的参数值,局部变量的值等。
堆区(heap):由程序员分配并释放,若程序员不释放,程序运行结束时由操作系统回收。(内存泄漏的事情还是挺可怕的)
寄存器区:用来保存栈顶指针和指令指针。
全局区,又叫静态区(static):全局变量和静态变量是存放在一起的。初始化的全局变量和静态变量放在一起;未初始化的全局变量和静态变量放在相邻的另一区域。程序结束时,由系统回收。
文字常量区:常量字符串放在这里。程序结束时由系统回收。
程序代码区:存放函数体的二进制代码。
上面的废话结束了,其实本文递归就和栈区的功能有关。哈哈哈,是不是觉得有种练了葵花宝典,最后看到“不用自宫,,也可练此功”的感觉。
首先,栈是在程序执行前就被系统分配了,也就是说,对于该程序而言,栈的大小是确定的,而且数据是先进后出的顺序。
然后,需要明白,递归是直接或间接调用函数本身,也就是说,每调用一次,需要将该函数的变量,也就是局部变量进栈一次。
最后,需要退栈,先退顶层的,也就是函数最后调用那层,当先入栈那层退出后,递归结束。
n皇后问题
懒得描述了,问题直接点击n皇后问题。
c++代码如下(看不懂的话,带数据一步一步跑一次,如果还看不懂,评论区留言,当然,欢迎提意见,请尽情的批判我,蹂躏我吧):
#include"iostream"
#include"cstdio"
using namespace std;
int n;
int hashtable[11]={0};
int counter=0;
bool hash_column[11]={false};
int generate(int index)
{
if(index==n+1)
{
bool flag = true;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(hashtable[i]==hashtable[j]+j-i || hashtable[i]==hashtable[j]-j+i)
{
flag=false;
}
}
}
if(flag)
{
counter++;
for(int i=1;i<=n;i++)
{
cout<<" "<<hashtable[i];
}
cout<<endl;
}
return 0;
}
for(int i=1;i<=n;i++)
{
if(!hash_column[i])
{
hashtable[index]=i;
hash_column[i] = true;
generate(index+1);
hashtable[index]=0;
hash_column[i]=false;
}
}
return 0;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
counter=0;
generate(1);
if(counter==0)
cout<<"no solute!"<<endl;
}
return 0;
}