1.基础概念
1.一个函数调用其自身,就是递归
2.递归和普通函数调用一样是通过栈实现的
3.树与二叉树适合使用递归的形式来表述
4.算法分为基础步和归纳步
递归算法的一般性原则
递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要地信息的保存与回复
递归能够解决的问题所具有的特征
(1)问题的描述涉及规模
(2)问题的规模发生变化后,解决问题的方法完全相同,并且原问题的解由小规模问题的解构成
(3)小规模的问题是可以求解的(在有限步内可以停机)
2.典型问题
1.求阶乘
输入:n
输出:n!
int factorial(int n)
{
if(n==0)
return 1;
else return n*factorial(n-1);
}
2.汉诺塔
输入:盘子的个数n、柱子的名称a,b,c
输出:移动方案
#include<stdio.h>
void hanoi(int n,char a, char b, char c)
{
if(n==1)
printf("%c->%c\n",a,c);
else
{
hanoi(n-1,a,c,b);
printf("%c->%c\n",a,c);
hanoi(n-1,b,a,c);
}
}
int main()
{
int n;
char A='A',B='B',C='C';
scanf("%d",&n);
hanoi(n,A,B,C);
return 0;
}
3.斐波那契数列
输入:位数n
输出:斐波那契数列第n位的值
int fbnq(int n)
{
if(n==1||n==2)
return 1;
else
return fbnq(n-1)+fbnq(n-2);
}
int main()
{
int n,re;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
re = fbnq(i);
printf("%d ",re);
}
return 0;
}
4.下楼梯
有n阶楼梯,每次只能下一个或者两个,计算一共有多少种下楼方法
int xlt(int n)
{
if(n==0||n==1)return 1;
return xlt(n-1)+xlt(n-2)+xlt(n-3);
}
5.分治算法求n个元素的最大值和最小值
算法思想:
1.将n个数均分为s1和s2
2.分别求解s1和s2的最大值和最小值
s1最大值为max1,s1最小值为min1
s2最大值为max2,s2最小值为min2
3.计算min(min1,min2),max(max1,max2)
void Maxmin(int a[],int l,int r,int &x,int &y)
{
if(l==r)///只有一个数的情况
{
x=a[l],y=a[l];
return;
}
if(r-l==1)///只有两个数的情况
{
if(a[l]<a[r])
{
x=a[l],y=a[r];
}
else
{
x=a[r],y=a[l];
}
}
else
{
int mid=(l+r)/2;
int x1,y1,x2,y2;
Maxmin(a,l,mid,x1,y1);
Maxmin(a,mid+1,r,x2,y2);
x=min(x1,x2);
y=max(y1,y2);
}
}