递归算法

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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是递归函数 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递...
    古月半半阅读 4,544评论 0 1
  • 目录介绍 01.什么是递归 02.递归三个条件 03.斐波那契数列 04.找指定目录下所有文件 05.求1+2+…...
    杨充211阅读 523评论 0 5
  • 计算机科学的新学生通常难以理解递归程序设计的概念。递归思想之所以困难,原因在于它非常像是循环推理(circular...
    启明_b56f阅读 7,411评论 0 20
  • 在计算机程序中,描述迭代的一种方法是使用循环,另一种完全不同的迭代实现方法就是递归。阶乘函数(通常表示为n!)是一...
    心_7e09阅读 987评论 0 1
  • 夜莺2517阅读 127,752评论 1 9