算法篇之递归学习(一)

递归:一个函数调用其自身函数

 

例题1 求阶乘

/**
求阶乘问题 
*/ 
#include<iostream>
using namespace std;
int Factorial(int n)
{
	if(n==0)
		return  1;
	return n*Factorial(n-1);
}
int main() 
{
	int n;
	cin>>n;
	cout<<Factorial(n);
	return 0;
}

例题2 汉诺塔问题

古代有一个梵塔,塔内有三个座A,B,C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。

/**
汉诺塔问题 
*/
#include<iostream>
using namespace std;
void Hanoi(int n,char src,char mid,char dest)
{
	if(n==1)
	{
		cout<<src<<"->"<<dest<<endl;
		return; 
	}
	Hanoi(n-1,src,dest,mid);
	cout<<src<<"->"<<dest<<endl;
	Hanoi(n-1,mid,src,dest); 
	return;
}
int main()
{
	int n;
	cin>>n;
	Hanoi(n,'A','B','C');
	return 0;
}

例题3:n皇后问题

输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案。

输入:

输入一个正整数N,则程序输出N皇后问题的全部白发。

输出:

输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列。

皇后的行、列编号都是从1开始算。

 

样例输入:4

样例输出:

2 4 1 3

3 1 4 2

/**
n皇后问题
这里采取了回溯法 
*/
#include<iostream>
#include<math.h>
#define maxsize 100
using namespace std;
int n;
int x[maxsize];
//检测第k个是否与前k-1个冲突
int nocollision(int k)
{
	int j=1;
	while(j<k)
	{
		if(x[j]==x[k]||(abs(x[j]-x[k]))==abs(j-k))
			return 0;
		j++;
	}
	return 1;
}
void place(int k,int n)
{
	if(k>n)
	{
		for(int i=1;i<=n;i++)	
			cout<<x[i]<<" ";
		cout<<endl;
	}
	for(int i=1;i<=n;i++)
	{
		x[k]=i;
		if(nocollision(k))
			place(k+1,n);
		x[k]=0;
	}
} 
int main()
{
	cin>>n;
	place(1,n);
	return 0;
}

例题四:逆波兰表达式

逆波兰表达式的定义:一个数是一个逆波兰表达式,值为该数。“运算符 逆波兰表达式 逆波兰表达式”是逆波兰表达式,值为两个逆波兰表达式的值运算的结果。

atof(),是C 语言标准库中的一个字符串处理函数,功能是把字符串转换成浮点数,所使用的头文件为<stdlib.h>。该函数名是 “ascii to floating point numbers” 的缩写。语法格式为:double atof(const char *nptr)。

/**
逆波兰表达式 
*/
#include<iostream>
#include<stdlib.h>
using namespace std;
double exp()//读入一个逆波兰表达式,并计算其值 
{
	char s[20];
	cin>>s;
	switch(s[0])
	{
		case '+':return exp()+exp();
		case '-':return exp()-exp();
		case '*':return exp()*exp();
		case '/':return exp()/exp();
		default:return atof(s);
		break;
	}
}
int main()
{
	cout<<exp()<<endl;
	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mind_programmonkey

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

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

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

打赏作者

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

抵扣说明:

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

余额充值