八皇后有关问题的递归算法,为什么能输出好几个结果

八皇后问题的递归算法,为什么能输出好几个结果?
#include<stdio.h>
#include <math.h>
#define SUCCESS 1
#define FAIL 0
#define STATE bool
const int Queen = 5;

int column[Queen];
int number=0;


//输出函数
void Output()
{
++number;
printf("解法编号:%d\n",number);
for (int i=0;i<Queen;++i)
{
for (int j=0;j<Queen;++j)
{
if (column[i]-1==j)
{
printf(" Q");
}
else
printf(" .");
}
printf("\n");

}
printf("\n\n");

}

STATE IsValid(int num)
{
for(int i=0;i<num;++i)
{
//检查是否同列
if (column[i]==column[num])
{
return FAIL;
}
//检查是否同在一条斜线上
if (abs(column[i]-column[num])==(num-i))
{
return FAIL;
}

}
return SUCCESS;
}

//疑问:到底是怎么输出好几个结果的?
//我感觉输出一种结果就会结束这个函数啊
void EightQueen(int num)
{
//如果找到了一种解法,则输出
if (num==Queen)
{
Output();
}
else
{
for (int col=1;col<=Queen;++col)
{
column[num] = col;
if (IsValid(num))
{
EightQueen(num+1);
}
}
}


}


void main()
{

EightQueen(0);

}


研究经典算法的时候对这个递归有点不大能理解,不知道为什么可以输出所有可能结果,我觉得输出一个结果之后就结束了啊。
请各位大神帮忙点化一下QAQ
------解决思路----------------------
因为 col 和  num 没实质性的算法关系,所以会有很多层递归,每层递归直到num=5结束
------解决思路----------------------
for (int col=1;col<=Queen;++col)
        {
            column[num] = col;
            if (IsValid(num))
            {
                EightQueen(num+1);
            }
        }
for循环中一行一行遍历了所有可能的情况,第num行不冲突时,开始遍历下一行,
直到num=queen,输出,之后回到上一行继续遍历
------解决思路----------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出