递归例题合集

#include<stdio.h>

int djc(int n);

int djc(int n){
	return n ? n*djc(n-1) : 1; 
}

void main(void){
	int n;

	printf("请输入一个小于13的正整数:");
	scanf("%d", &n);
	printf("%d! = %d\n", n, djc(n));
}

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>

int Fibonacci(int n);

int Fibonacci(int n){
	int res;

	if(n <= 2)
		res = 1;
	else
		res = Fibonacci(n-1) + Fibonacci(n-2);

	return res;
}

void main(void){
	int n;

	for(n = 1; n < 30; n++){
		printf("(%d:)%d\n", n, Fibonacci(n));
	}
}

在这里插入图片描述
在这里插入图片描述

//递归实现字符串逆序 

#include<stdio.h>
#include<string.h>

void fun1(char *str, int len);  //从外面向里面交换 
void fun2(char *str, int len);  //从里面向外面交换 
void fun3(char *old, char *str, int len, int thisTime);  
//为了输出一些别的信息 
//加old指针是为了每次都可以重头开始输出 
//加thisTime是为了知道这是第几次进行的交换 

void fun3(char *old, char *str, int len, int thisTime){
/*
	0 1 2 3 4 5 6 7 8
	a b c d e f g h \0
		  e d            第一次修改
		f     c	
	  g         b
	h             a   

*/

	char tmp;
	
	if(len > 0){
		fun3(old, str+1, len-2, thisTime+1);   //这个地方不可以用thisTime++,自己再研究一下递归中++的问题 
		
		tmp = str[0];
		str[0] = str[len-1];
		str[len-1] = tmp;
		
		//printf("%s\n", str);  //如果输出str的话,则不能重头开始输出
		printf("第%d次调用:%s\n", thisTime, old); 
	}
}

void fun2(char *str, int len){
	char tmp;
	
	if(len > 0){
		fun2(str+1, len-2);
		
		tmp = str[0];
		str[0] = str[len-1];
		str[len-1] = tmp;
	}
}


void fun1(char *str, int len){
	char tmp;
	
	if(len > 0){
		tmp = str[0];
		str[0] = str[len-1];
		str[len-1] = tmp;
		
		fun1(str+1, len-2);
	}
}

int main(){
	char s1[80] = "abcdefgh";
	char s2[80] = "abcdefgh";
	char s3[80] = "abcdefgh";
	//printf("strlen(s) = %d\n", strlen(s));   //  "abcdefgh"   8
	//printf("strlen(s+1) = %d\n", strlen(s+1));
	fun1(s1, strlen(s1));
	puts(s1);
	fun2(s2, strlen(s2));
	puts(s2);

	printf("******\n");
	fun3(s3, s3, strlen(s3), 1);
	
}

在这里插入图片描述
在这里插入图片描述

//移动n个盘子要经历2^n-1步 

#include<stdio.h>

void Hanoii(int n, char source, char aux, char des);
void Hanoii1(int n, char source, char aux, char des);   //朱老师的写法 
void Hanoii2(int n, char source, char aux, char des);   //朱老师的写法   为了看进行了多少次操作 


void Hanoii2(int n, char source, char aux, char des){	 
//静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
//静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。
	static int times = 0;
	 
	if(n > 0){
		Hanoii2(n-1, source, des, aux);
		printf("(%2d)%d, %c->%c \n", ++times, n, source, des);
		Hanoii2(n-1, aux, source, des);
	}
	
}

void Hanoii1(int n, char source, char aux, char des){	 
	if(n > 0){
		Hanoii1(n-1, source, des, aux);
		printf("%d, %c->%c \n", n, source, des);
		Hanoii1(n-1, aux, source, des);
	}
	
}

void Hanoii(int n, char source, char aux, char des){
	if(n == 1){
		printf("%d, %c->%c \n", n, source, des);
	}else{
		Hanoii(n-1, source, des, aux);
		printf("%d, %c->%c \n", n, source, des);
		Hanoii(n-1, aux, source, des);
	}
	
}

int main(void){
	int n;
	
//	Hanoii(4, 'A', 'B', 'C');
//	printf("\n");
//	Hanoii1(4, 'A', 'B', 'C');
//	printf("\n");
	Hanoii2(4, 'A', 'B', 'C');
	
}
 
     

在这里插入图片描述

八皇后问题

手工过程很重要,不要一上来就写循环,写代码,要先写手工过程
代码是对手工过程的体现
very important!

//回溯法指导思想——走不通,就掉头。
//八皇后问题共92个解 

/*
anan
2020.1.30
思路:定义一个栈,栈里面放皇后的列数 如果所有列都找完没有找到,则上一个皇后出栈,重新开始放上一个皇后,集回溯 
*/

#include<stdio.h>

#define QUEENS 8

typedef struct QueenStack{
	int col[QUEENS+1];   //虽然理论上从0开始,但是从1开始比较方便,所以这个地方要加1 
	int top;
}QueenStack;

bool isSafe(QueenStack qt, int i, int j);
void placeQueens(int queens);
void showQueens(QueenStack qt);

void showQueens(QueenStack qt){
	//printf("当前皇后放置情况如下:\n");
	//printf("qt.top = %d\n", qt.top);
	for(int i = 1; i <= qt.top; i++){
		printf("(%d, %d) ", i, qt.col[i]);
	}
	printf("\n");
}

void placeQueens(int queens){
	QueenStack queenStack;	
	queenStack.top = 0;
	int queen_i = 1;
	int queen_j = 0;
	bool find = true; 
	int tmp_j = -1;
	int number = 0;  //解的个数 
	
	while((queen_i)<queens+1){
		//printf("\n\n******\n");
		//printf("queen_i = %d\n", queen_i);
		
		if(find == false){
			queen_j = tmp_j; //回溯 从上一个皇后找到位置的下一个开始 
		}else{
			queen_j = 0;    //每次新开始一个皇后,j都要从0开始
		}
		 
		while((++queen_j)<queens+1){
			//printf("queen_j = %d\n", queen_j);
			if(isSafe(queenStack, queen_i, queen_j)){
				//printf("safe\n");
				queenStack.top++;
				queenStack.col[queenStack.top] = queen_j;
				find = true;
				queen_i++;
				//showQueens(queenStack);	
				break;		
			}			
		}
		if(queen_j==queens+1){     //这一行将所有列都找完了,没有找到合适的,需要进行回溯su 
			
			tmp_j = queenStack.col[queenStack.top];
			//printf("queen_i = %d  ", queen_i);
			//printf("所有列找完没有\n");
			queenStack.top--;
			queen_i--;
			find = false;
		}
		if(queenStack.top==queens){   //等价于queen_i == 9   //找到一个解了,继续找下一个解 
			number++;
			printf("第%2d个解为:", number); 
			showQueens(queenStack);
			tmp_j = queenStack.col[queenStack.top];
			queenStack.top--;    
			queen_i--;
			find = false;
		} 
		
		if(queen_i == 0){   //八皇后问题共92个解,不加这个条件的话,92之后,又重复之前的进行输出,无穷无尽 
			break;
		}
	}
}


bool isSafe(QueenStack qt, int queen_i, int queen_j){
	//比较的对象:   (i, qt.col[i])    (queen_i, queen_j)
	
	for(int i = 1; i < queen_i; i++){      //不同行 
		//printf("(i, qt.col[i])=(%d, %d) (queen_i,queen_j)=(%d, %d)\n", i, qt.col[i], queen_i, queen_j);
		if(qt.col[i] == queen_j){          //不同列 
			return false;
		}else if((queen_i-i) == (queen_j-qt.col[i])){   //不同主对角线 
			return false;
		}else if((i+qt.col[i]) == (queen_i+queen_j)){   //不同副对角线 
			return false;
		}
	}
	return true;
}

int main(){
	placeQueens(QUEENS);
	
} 
//回溯法指导思想——走不通,就掉头。
//八皇后问题共92个解 

/*
anan
2020.1.30
思路:用递归的方法求解  借鉴实验书 
*/

#include<stdio.h>

#define QUEENS 8

int col[QUEENS+1];   //存放皇后的列数 
int count = 0;   //解的个数 

bool isSafe(int i, int j);
void placeQueens(int n, int k);
void showQueens(int n);

void showQueens(int n){
	count++;
	printf("第%2d个解为:", count);
	for(int i = 1; i <= n; i++){
		printf("(%d, %d) ", i, col[i]);
	}
	printf("\n");
}

void placeQueens(int n, int k){  //queen表示皇后的个数,k表示现在放置的是第i个皇后 
	int queen_i = k;
	
	if(queen_i > n){
		showQueens(n);
	}else{
		for(int queen_j = 1; queen_j <= n; queen_j++){
			if(isSafe(queen_i, queen_j)){
				col[queen_i] = queen_j;
				placeQueens(n, queen_i+1);
			}
		}
	}
}


bool isSafe(int queen_i, int queen_j){
	//比较的对象:   (i, col[i])    (queen_i, queen_j)
	
	for(int i = 1; i < queen_i; i++){      //不同行 
		if(col[i] == queen_j){          //不同列 
			return false;
		}else if((queen_i-i) == (queen_j-col[i])){   //不同主对角线 
			return false;
		}else if((i+col[i]) == (queen_i+queen_j)){   //不同副对角线 
			return false;
		}
	}
	return true;
}

int main(){
	placeQueens(QUEENS, 1);
	
} 
//朱老师
#include<stdio.h>

#define NUMBER	8

typedef u nsigned char boolean;

#define TRUE	1
#define FALSE	0

boolean isSafe(int (*chess)[NUMBER], int row, int col);
void showChess(int (*chess)[NUMBER]);
void eightQueens(int (*chess)[NUMBER], int row);

void eightQueens(int (*chess)[NUMBER], int row){
	if(row >= NUMBER){
		showChess(chess);
	}else{
		int col;
		
		for(col = 0; col < NUMBER; col++){
			if(isSafe(chess, row, col)){
				chess[row][col] = 1;
				eightQueens(chess, row+1);
				chess[row][col] = 0;
			}
		}
	}
}

void showChess(int (*chess)[NUMBER]){
	int row;
	int col;
	static int count = 0;

	printf("第%d个解:\n", ++count);
	for(row = 0; row < NUMBER; row++){
		for(col = 0; col < NUMBER; col++){
			printf("%4d", chess[row][col]);
		}
		printf("\n");
	}
}

boolean isSafe(int (*chess)[NUMBER], int row, int col){
	int i;
	int j;

	for(i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--){
		if(chess[i][j] == 1){
			return FALSE;
		}
	}

	for(i = row-1, j = col; i >= 0; i--){
		if(chess[i][j] == 1){
			return FALSE;
		}
	}

	for(i = row-1, j = col+1; i >= 0 && j < NUMBER; i--, j++){
		if(chess[i][j] == 1){
			return FALSE;
		}
	}

	return TRUE;
}

void main(void){
	int eightQueen[NUMBER][NUMBER] = {0};

	eightQueens(eightQueen, 0);
}

第 1个解为:(1, 1) (2, 5) (3, 8) (4, 6) (5, 3) (6, 7) (7, 2) (8, 4)
第 2个解为:(1, 1) (2, 6) (3, 8) (4, 3) (5, 7) (6, 4) (7, 2) (8, 5)
第 3个解为:(1, 1) (2, 7) (3, 4) (4, 6) (5, 8) (6, 2) (7, 5) (8, 3)
第 4个解为:(1, 1) (2, 7) (3, 5) (4, 8) (5, 2) (6, 4) (7, 6) (8, 3)
第 5个解为:(1, 2) (2, 4) (3, 6) (4, 8) (5, 3) (6, 1) (7, 7) (8, 5)
第 6个解为:(1, 2) (2, 5) (3, 7) (4, 1) (5, 3) (6, 8) (7, 6) (8, 4)
第 7个解为:(1, 2) (2, 5) (3, 7) (4, 4) (5, 1) (6, 8) (7, 6) (8, 3)
第 8个解为:(1, 2) (2, 6) (3, 1) (4, 7) (5, 4) (6, 8) (7, 3) (8, 5)
第 9个解为:(1, 2) (2, 6) (3, 8) (4, 3) (5, 1) (6, 4) (7, 7) (8, 5)
第10个解为:(1, 2) (2, 7) (3, 3) (4, 6) (5, 8) (6, 5) (7, 1) (8, 4)
第11个解为:(1, 2) (2, 7) (3, 5) (4, 8) (5, 1) (6, 4) (7, 6) (8, 3)
第12个解为:(1, 2) (2, 8) (3, 6) (4, 1) (5, 3) (6, 5) (7, 7) (8, 4)
第13个解为:(1, 3) (2, 1) (3, 7) (4, 5) (5, 8) (6, 2) (7, 4) (8, 6)
第14个解为:(1, 3) (2, 5) (3, 2) (4, 8) (5, 1) (6, 7) (7, 4) (8, 6)
第15个解为:(1, 3) (2, 5) (3, 2) (4, 8) (5, 6) (6, 4) (7, 7) (8, 1)
第16个解为:(1, 3) (2, 5) (3, 7) (4, 1) (5, 4) (6, 2) (7, 8) (8, 6)
第17个解为:(1, 3) (2, 5) (3, 8) (4, 4) (5, 1) (6, 7) (7, 2) (8, 6)
第18个解为:(1, 3) (2, 6) (3, 2) (4, 5) (5, 8) (6, 1) (7, 7) (8, 4)
第19个解为:(1, 3) (2, 6) (3, 2) (4, 7) (5, 1) (6, 4) (7, 8) (8, 5)
第20个解为:(1, 3) (2, 6) (3, 2) (4, 7) (5, 5) (6, 1) (7, 8) (8, 4)
第21个解为:(1, 3) (2, 6) (3, 4) (4, 1) (5, 8) (6, 5) (7, 7) (8, 2)
第22个解为:(1, 3) (2, 6) (3, 4) (4, 2) (5, 8) (6, 5) (7, 7) (8, 1)
第23个解为:(1, 3) (2, 6) (3, 8) (4, 1) (5, 4) (6, 7) (7, 5) (8, 2)
第24个解为:(1, 3) (2, 6) (3, 8) (4, 1) (5, 5) (6, 7) (7, 2) (8, 4)
第25个解为:(1, 3) (2, 6) (3, 8) (4, 2) (5, 4) (6, 1) (7, 7) (8, 5)
第26个解为:(1, 3) (2, 7) (3, 2) (4, 8) (5, 5) (6, 1) (7, 4) (8, 6)
第27个解为:(1, 3) (2, 7) (3, 2) (4, 8) (5, 6) (6, 4) (7, 1) (8, 5)
第28个解为:(1, 3) (2, 8) (3, 4) (4, 7) (5, 1) (6, 6) (7, 2) (8, 5)
第29个解为:(1, 4) (2, 1) (3, 5) (4, 8) (5, 2) (6, 7) (7, 3) (8, 6)
第30个解为:(1, 4) (2, 1) (3, 5) (4, 8) (5, 6) (6, 3) (7, 7) (8, 2)
第31个解为:(1, 4) (2, 2) (3, 5) (4, 8) (5, 6) (6, 1) (7, 3) (8, 7)
第32个解为:(1, 4) (2, 2) (3, 7) (4, 3) (5, 6) (6, 8) (7, 1) (8, 5)
第33个解为:(1, 4) (2, 2) (3, 7) (4, 3) (5, 6) (6, 8) (7, 5) (8, 1)
第34个解为:(1, 4) (2, 2) (3, 7) (4, 5) (5, 1) (6, 8) (7, 6) (8, 3)
第35个解为:(1, 4) (2, 2) (3, 8) (4, 5) (5, 7) (6, 1) (7, 3) (8, 6)
第36个解为:(1, 4) (2, 2) (3, 8) (4, 6) (5, 1) (6, 3) (7, 5) (8, 7)
第37个解为:(1, 4) (2, 6) (3, 1) (4, 5) (5, 2) (6, 8) (7, 3) (8, 7)
第38个解为:(1, 4) (2, 6) (3, 8) (4, 2) (5, 7) (6, 1) (7, 3) (8, 5)
第39个解为:(1, 4) (2, 6) (3, 8) (4, 3) (5, 1) (6, 7) (7, 5) (8, 2)
第40个解为:(1, 4) (2, 7) (3, 1) (4, 8) (5, 5) (6, 2) (7, 6) (8, 3)
第41个解为:(1, 4) (2, 7) (3, 3) (4, 8) (5, 2) (6, 5) (7, 1) (8, 6)
第42个解为:(1, 4) (2, 7) (3, 5) (4, 2) (5, 6) (6, 1) (7, 3) (8, 8)
第43个解为:(1, 4) (2, 7) (3, 5) (4, 3) (5, 1) (6, 6) (7, 8) (8, 2)
第44个解为:(1, 4) (2, 8) (3, 1) (4, 3) (5, 6) (6, 2) (7, 7) (8, 5)
第45个解为:(1, 4) (2, 8) (3, 1) (4, 5) (5, 7) (6, 2) (7, 6) (8, 3)
第46个解为:(1, 4) (2, 8) (3, 5) (4, 3) (5, 1) (6, 7) (7, 2) (8, 6)
第47个解为:(1, 5) (2, 1) (3, 4) (4, 6) (5, 8) (6, 2) (7, 7) (8, 3)
第48个解为:(1, 5) (2, 1) (3, 8) (4, 4) (5, 2) (6, 7) (7, 3) (8, 6)
第49个解为:(1, 5) (2, 1) (3, 8) (4, 6) (5, 3) (6, 7) (7, 2) (8, 4)
第50个解为:(1, 5) (2, 2) (3, 4) (4, 6) (5, 8) (6, 3) (7, 1) (8, 7)
第51个解为:(1, 5) (2, 2) (3, 4) (4, 7) (5, 3) (6, 8) (7, 6) (8, 1)
第52个解为:(1, 5) (2, 2) (3, 6) (4, 1) (5, 7) (6, 4) (7, 8) (8, 3)
第53个解为:(1, 5) (2, 2) (3, 8) (4, 1) (5, 4) (6, 7) (7, 3) (8, 6)
第54个解为:(1, 5) (2, 3) (3, 1) (4, 6) (5, 8) (6, 2) (7, 4) (8, 7)
第55个解为:(1, 5) (2, 3) (3, 1) (4, 7) (5, 2) (6, 8) (7, 6) (8, 4)
第56个解为:(1, 5) (2, 3) (3, 8) (4, 4) (5, 7) (6, 1) (7, 6) (8, 2)
第57个解为:(1, 5) (2, 7) (3, 1) (4, 3) (5, 8) (6, 6) (7, 4) (8, 2)
第58个解为:(1, 5) (2, 7) (3, 1) (4, 4) (5, 2) (6, 8) (7, 6) (8, 3)
第59个解为:(1, 5) (2, 7) (3, 2) (4, 4) (5, 8) (6, 1) (7, 3) (8, 6)
第60个解为:(1, 5) (2, 7) (3, 2) (4, 6) (5, 3) (6, 1) (7, 4) (8, 8)
第61个解为:(1, 5) (2, 7) (3, 2) (4, 6) (5, 3) (6, 1) (7, 8) (8, 4)
第62个解为:(1, 5) (2, 7) (3, 4) (4, 1) (5, 3) (6, 8) (7, 6) (8, 2)
第63个解为:(1, 5) (2, 8) (3, 4) (4, 1) (5, 3) (6, 6) (7, 2) (8, 7)
第64个解为:(1, 5) (2, 8) (3, 4) (4, 1) (5, 7) (6, 2) (7, 6) (8, 3)
第65个解为:(1, 6) (2, 1) (3, 5) (4, 2) (5, 8) (6, 3) (7, 7) (8, 4)
第66个解为:(1, 6) (2, 2) (3, 7) (4, 1) (5, 3) (6, 5) (7, 8) (8, 4)
第67个解为:(1, 6) (2, 2) (3, 7) (4, 1) (5, 4) (6, 8) (7, 5) (8, 3)
第68个解为:(1, 6) (2, 3) (3, 1) (4, 7) (5, 5) (6, 8) (7, 2) (8, 4)
第69个解为:(1, 6) (2, 3) (3, 1) (4, 8) (5, 4) (6, 2) (7, 7) (8, 5)
第70个解为:(1, 6) (2, 3) (3, 1) (4, 8) (5, 5) (6, 2) (7, 4) (8, 7)
第71个解为:(1, 6) (2, 3) (3, 5) (4, 7) (5, 1) (6, 4) (7, 2) (8, 8)
第72个解为:(1, 6) (2, 3) (3, 5) (4, 8) (5, 1) (6, 4) (7, 2) (8, 7)
第73个解为:(1, 6) (2, 3) (3, 7) (4, 2) (5, 4) (6, 8) (7, 1) (8, 5)
第74个解为:(1, 6) (2, 3) (3, 7) (4, 2) (5, 8) (6, 5) (7, 1) (8, 4)
第75个解为:(1, 6) (2, 3) (3, 7) (4, 4) (5, 1) (6, 8) (7, 2) (8, 5)
第76个解为:(1, 6) (2, 4) (3, 1) (4, 5) (5, 8) (6, 2) (7, 7) (8, 3)
第77个解为:(1, 6) (2, 4) (3, 2) (4, 8) (5, 5) (6, 7) (7, 1) (8, 3)
第78个解为:(1, 6) (2, 4) (3, 7) (4, 1) (5, 3) (6, 5) (7, 2) (8, 8)
第79个解为:(1, 6) (2, 4) (3, 7) (4, 1) (5, 8) (6, 2) (7, 5) (8, 3)
第80个解为:(1, 6) (2, 8) (3, 2) (4, 4) (5, 1) (6, 7) (7, 5) (8, 3)
第81个解为:(1, 7) (2, 1) (3, 3) (4, 8) (5, 6) (6, 4) (7, 2) (8, 5)
第82个解为:(1, 7) (2, 2) (3, 4) (4, 1) (5, 8) (6, 5) (7, 3) (8, 6)
第83个解为:(1, 7) (2, 2) (3, 6) (4, 3) (5, 1) (6, 4) (7, 8) (8, 5)
第84个解为:(1, 7) (2, 3) (3, 1) (4, 6) (5, 8) (6, 5) (7, 2) (8, 4)
第85个解为:(1, 7) (2, 3) (3, 8) (4, 2) (5, 5) (6, 1) (7, 6) (8, 4)
第86个解为:(1, 7) (2, 4) (3, 2) (4, 5) (5, 8) (6, 1) (7, 3) (8, 6)
第87个解为:(1, 7) (2, 4) (3, 2) (4, 8) (5, 6) (6, 1) (7, 3) (8, 5)
第88个解为:(1, 7) (2, 5) (3, 3) (4, 1) (5, 6) (6, 8) (7, 2) (8, 4)
第89个解为:(1, 8) (2, 2) (3, 4) (4, 1) (5, 7) (6, 5) (7, 3) (8, 6)
第90个解为:(1, 8) (2, 2) (3, 5) (4, 3) (5, 1) (6, 7) (7, 4) (8, 6)
第91个解为:(1, 8) (2, 3) (3, 1) (4, 6) (5, 2) (6, 5) (7, 7) (8, 4)
第92个解为:(1, 8) (2, 4) (3, 1) (4, 3) (5, 6) (6, 2) (7, 7) (8, 5)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安安csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值