一、用递归实现 n! 计算
int f(int n){
if(n==0)
return 1;
else return n*f(n-1);
}
二 、实现斐波拉契数列
int f(int n){
if(n<=2) return 1;
else return f(n-1)+f(n+1);
}
三、函数调用与递归实现
1.活动记录:
每个函数的活动状态由函数中所有局部变量内容,函数参数的值,表明在调用函数的何处重新开始的返回地址,包含所有这些信息的数据区称为活动记录。只要函数在执行,活动记录就一直在,函数结束时,活动区释放空间。活动记录通常包含:
- 函数所有参数值
- 可以存储在其他地方的局部变量
- 返回地址
- 一个指向调用程序活动记录的指针
- 非void类型的函数返回值
四、八皇后实现部分代码(递归实现)
class ChessBoard{
public:
ChessBoard();
ChessBoard(int);
void findSolutions();
private:
const bool available;
const int squares, norm;
bool *column, *leftDiagonal, *rightDiagonal;
int *postionInRow, howMany;
void putQueen(int);
void printBoard(ostream&);
void initialzeBoard();
};
ChessBoard::ChessBoard() :available(true), squares(8), norm(squares-1)
{
initialzeBoard();
}
ChessBoard::ChessBoard(int n) : available(true), squares(n), norm(squares - 1)
{
initialzeBoard();
}
void ChessBoard::initialzeBoard(){ //初始化各个值的长度
register int i;
column = new bool[squares];
postionInRow = new int[squares];
leftDiagonal = new bool[2 * squares - 1];
rightDiagonal = new bool[2 * squares - 1];
for ( i = 0; i < squares; i++)
{
postionInRow[i] = -1;
}
for ( i = 0; i < squares; i++)
{
column[i] = available;
}
for ( i = 0; i < squares*2-1; i++)
{
leftDiagonal[i] = rightDiagonal[i] = available;
}
howMany = 0;
}
void ChessBoard::putQueen(int row){
for (int col = 0; col < squares; col++){
if (column[col] == available && leftDiagonal[col + row] == available && rightDiagonal[row - col + norm] == available){
postionInRow[row] = col;
column[col] = !available;
leftDiagonal[row + col] = !available;
rightDiagonal[row - col + norm] = !available;
if (row < squares - 1)
putQueen(row + 1);
else printBoard(cout);
column[col] = available;
leftDiagonal[row + col] = available;
rightDiagonal[row - col + norm] = available;
}
}
}
void ChessBoard::findSolutions(){
putQueen(0);
cout << howMany << "solution found.\n";
}