IT公司面试题收集整理-C相干-八皇后和斐波那契数列【递归的常用小程序】

IT公司面试题收集整理---C相关---八皇后和斐波那契数列【递归的常用小程序】

1.N!的递归算法

#include<stdio.h>
int find(int n)
{
	if(n==1){
		return 1;
	}else{
		return find(n-1)*n;
	}
}
int main(void)
{
	int n;
	printf("请输入N!中的N值:");
	scanf("%d",&n);
	printf("%d\n",find(n));
	return 0;
}

2.斐波那契数列1

#include<stdio.h>
int f(int n)
{
	if(n<1){
		return 0;
	}else if(n==1||n==2){
		return 1;
	}else{
		return f(n-1)+f(n-2);
	}
}
int main(void)
{
	int n,i;
	printf("请输入斐波那契数列个数n:");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		printf("%d ",f(i));
	printf("\n");
	return 0;
}

3.斐波那契数列2

#include<stdio.h>
int N;
int PRE=1;
int AFTER=1;
int RESULT=0;
/*时间复杂度最低*/
int main(void)
{
	int n,i;
	printf("请输入斐波那契数列个数n:");
	scanf("%d",&n);
	N=n;
	printf("1 1 ");
	for(i=2;i<n;i++)
	{
		RESULT=PRE+AFTER;
		PRE=AFTER;
		AFTER=RESULT;
		printf("%d ",RESULT);
	}
	printf("\n");
	return 0;
}

4.斐波那契数列3

#include<stdio.h>
int N;
int PRE=1;
int AFTER=1;
int RESULT=0;
/*递归控制循环的斐波那契数列*/
int f(int n)
{
	if(n>2){
		f(n-1);
		RESULT=PRE+AFTER;
		PRE=AFTER;
		AFTER=RESULT;
		printf("%d ",RESULT);
	}else{
		printf("1 1 ");
	}
	return RESULT;
}
int main(void)
{
	int n;
	printf("请输入斐波那契数列个数n:");
	scanf("%d",&n);
	N=n;
	f(n);
	printf("\n");
	return 0;
}

5.汉诺塔问题

#include<stdio.h>
void hannuo(int n,char x,char y,char z)
{
	if(n==1)
		printf("%c->%c\n",x,z);
	else
	{
		hannuo(n-1,x,z,y);
		printf("%c->%c\n",x,z);
		hannuo(n-1,y,x,z);
	}
}

int main(void)
{
	int n;
	printf("请输入汉诺塔的层数:");
	scanf("%d",&n);
	printf("汉诺塔的步骤为:\n");
	hannuo(n,'A','B','C');
	return 0;
}

6.八皇后问题

#include <stdio.h>
#define ROW 8
#define COL 8
#define NUM 8
int a[ROW][COL];
int k = 0;
int put( int n)
{
	int i, j;
	//输出八皇后棋盘
	if( n > NUM)
	{
		printf( "----------%06d----------\n", ++k);
		for( i = 0; i < ROW; i ++)
		{
			for( j = 0; j < COL; j ++)
				printf( "%s  ", a[i][j] == 1 ? "○" : "●");
			printf( "\n\n");
		}
		printf( "--------------------------\n\n");
		return -1;
	}
	// 尝试行中的每个位置
	for( j = 0; j < COL; j ++)
	{
		int flag = 0;
		for( i = 0; i < n - 1; i ++)
		{
			// 是否同列
			if( a[i][j] == 1)
			{
				flag = 1;
				break;
			}
			// 是否左斜角
			if( j - ( n - 1 - i) >= 0 && a[i][j - ( n - 1 - i)] == 1)
			{
				flag = 1;
				break;
			}
			// 是否右斜角
			if( j + ( n - 1 - i) < COL && a[i][j + ( n - 1 - i)] == 1)
			{
				flag = 1;
				break;
			}
		}
		if( flag == 0)
		{
			a[n-1][j] = 1;
			if( put( n + 1) == -1)
			{
				a[n-1][j] = 0;
			}else
				return 0;
		}
	}
	return -1;
}
int main()
{
	put(1);
	return 0;
}