递归算法

  • 定义:函数中可调用其他函数,递归特指函数中调用自身
  • 注意点:需定义终止条件( if (...) 调用自身),否则会无休止下去
  • 题型:汉诺塔、青蛙跳台阶、蜜蜂回家、求阶乘(也可用循环)

1. 汉诺塔问题:(拓展:对搬动次数计数)

有标记为1, 2, 3 的三根柱子,按规则摆放大小盘所需的步骤为:

step1: 将柱子1的 n-1 个盘移到柱子2上;属于间接移动,需借助柱子3

step2: 将柱子1的最后1个盘移到柱子3上;属于直接移动,无需借助其他柱子

step3: 将柱子2的 n-1 个盘移到柱子3上;属于间接移动,需借助柱子1

可认为终止条件为:

当 n=1 时,将柱子1的(最后)一个盘移到柱子2上;属于直接移动,无需借助其他柱子

#include <stdio.h>
int main()
{
    void zhijie_move(char a,char b);//直接移动只需一次,可不传递参数n
    void jianjie_move(int n,char a,char b,char c);
   //间接移动需传递三个参数,否则后续调用函数时会少柱子 int n; scanf("%d",&n); jianjie_move(n,'1','2','3');//用字符类型标记柱子 return 0; } void zhijie_move(char a,char b)//用字符类型标记柱子 { printf("%c->%c\n",a,b); } void jianjie_move(int n,char a,char b,char c) { if(n==1) { zhijie_move(a,c); } else { jianjie_move(n-1,a,c,b);//step1 zhijie_move(a,c);//step2 jianjie_move(n-1,b,a,c);//step3 } }

2. 青蛙跳台阶:

青蛙跳上n级台阶分别所共有的方法数,恰好满足斐波那契数列

故直接调用斐波那契数列函数 f (n) = f (n-1) + f (n-2),注意写明第一项第二项的值。

#include <stdio.h>
int feibo(int n)
{
    int method;
    if(n==1)
    {
        method=1;
    }
    else if(n==2)
    {
        method=2;
    }
    else
    {
        method=feibo(n-1)+feibo(n-2);
    }
    return method;
}
int main()
{
    int n,method;
    scanf("%d",&n);
    method=feibo(n);
    printf("%d",method);
}

3. 蜜蜂回家

蜜蜂从最初点1号,到下一个点所共有的路线数,恰好满足斐波那契数列

虽然起始点不一定从1号开始,但编号间隔相同路线等价

比如从1号到3号,与从3号到5号的蜂巢结构类似,则路线数相同。

也即,求从3号到5号的路线数时,直接求1号到3号的路线数,即为从1号到 (3-1+1) 的斐波那契数。

#include <stdio.h>
int feibo(int point)
{
    int route;
    if(point==1)
    {
        route=0;
    }
    else if(point==2)
    {
        route=1;
    }
    else if(point==3)
    {
        route=2;
    }
    else
    {
        route=feibo(point-1)+feibo(point-2);
     //当point=1,2,3时,不会执行feibo(n-1)+feibo(n-1),因前面分支会抢先执行 } return route; } int main() { int a,b,route_a,route_b,route; scanf("%d%d",&a,&b); route=feibo(b-a+1);//间隔相同则线路等价,间隔加起始点1为终点编号 printf("%d",route); return 0; }

4. 求阶乘

递归步骤为:

n! = n * (n-1)!

可视终止条件为:

0! = 1

#include <stdio.h>
int jiecheng(int n)
{
    int plus;
    if(n==0)
    {
        plus=1;
    }
    else if(n==1)
    {
        plus=1;
    }
    else
    {
        plus=n*jiecheng(n-1);//比如5!=5*4!
    }
    return plus;
}
int main()
{
    int n,plus;
    scanf("%d",&n);
    plus=jiecheng(n);
    printf("%d",plus);
    return 0;
}

-END

posted @ 2022-10-14 10:58  找回那所有、  阅读(52)  评论(0)    收藏  举报
这里到底了哦~(●'◡'●)