【数据结构】第3章 栈和队列 递归算法

【阶乘、斐波那契数列、链表递归、汉诺塔】


对于复杂问题, 若能够分解成几个相对简单且解法相同或类似的子问题来求解, 便称作递归求解。
例如, 计算 4!时先计算 3!然后再进一步分解进行求解,这种分解-求解的策略叫做 “分治法”。

“分治法” 求解递归问题算法的一般形式为:

void p(参数表)
{
    if(递归结束条件成立)          //递归终止条件
        可直接求解;
    else p(较小的参数);          //递归步骤
}

当递归结束条件成立,只执行return操作时,“分治法” 求解递归问题算 法的一般形式可以简化为:

void p(参数表)
{
    if(递归结束条件不成立)       //递归终止条件
        p(较小的参数);          //递归步骤
}

1、定义是递归的

1、阶乘
//1、阶乘
long Fact(long n)
{
    if(n == 0)
        return 1;                       //递归终止条件
    else
        return n * Fact(n - 1);         //递归步骤
}
2、斐波那契数列
//2、斐波那契数列
long Fib(long n)
{
    if(n == 1 || n == 2)
        return n;                       //递归终止条件
    else
        return Fib(n - 1) + Fib(n - 2); //递归步骤
}

2、数据结构是递归的

1、链表递归遍历
//1、链表递归遍历
void TraverseList(LinkList p)
{
    if(p == NULL)
        return;                 //递归中止
    else
    {
        cout<<p->data<<ends;     //输出当前数据域
        TraverseList(p->next);  //p指向后继结点继续递归
    }
}

可化简为:

//1、链表递归遍历_简化
void TraverseList(LinkList p)
{
    if(p)                       //递归不中止
    {
        cout<<p->data<<ends;     //输出当前数据域
        TraverseList(p->next);  //p指向后继结点继续递归
    }
}

(关于 endl ends flush 戳这篇!!!

3、问题的解法是递归的

1、汉诺塔
//1、汉诺塔
#include<bits/stdc++.h>
using namespace std;
int m;
void move(char A, int n, char C)
{
    //m是搬动次数,n是圆盘序号,从A搬到C
    cout<<++m<<","<<n<<","<<A<<","<<C<<endl;
}
void Hanoi(int n, char A, char B, char C)
{//将A上的n个圆盘按规则搬到C上,B做辅助
    if(n == 1)
        move(A, 1, C);
    else
    {
        Hanoi(n - 1, A, C, B);      //把前n-1个从A搬到B上,移动多个圆盘,需要递归
        move(A, n, C);              //把第n个从A搬到C上,只移动1个圆盘,不需要递归,此函数只记录搬运过程
        Hanoi(n - 1, B, A, C);      //把前n-1个从B搬到C上,移动多个圆盘,需要递归
    }
}

int main()
{
    int n;
    char a = 'A', b = 'B', c = 'C'; //分别代表3根柱子
    while(cin>>n)                   //输入圆盘个数
    {
        m = 0;                      //搬动次数(最终m = 2^n - 1)
        Hanoi(n, a, b, c);          //将A柱上的所有圆盘移动到C柱上
    }
    return 0;
}

在这里插入图片描述

2、八皇后
3、迷宫
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_碗碗儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值