递归算法

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

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]

你可能感兴趣的:(递归算法)