递归详解,斐波那契数列、二叉树遍历、汉诺塔问题的递归代码

这篇具有很好参考价值的文章主要介绍了递归详解,斐波那契数列、二叉树遍历、汉诺塔问题的递归代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、递归详解

[1] 递归是一种编程技巧,通过函数调用自身来解决问题。递归中包含三个要素:递归定义、递归出口和递归调用。

[2] 递归定义指的是问题可以被分解为同类且更小规模的子问题。在递归过程中,问题会不断被分解为规模更小的子问题,直到达到一个基本情况,该基本情况可以被直接求解,而无需再进行递归调用。

[3] 递归出口是指基本情况的判断条件。如果满足基本情况,递归函数将直接返回结果,否则将继续进行递归调用。

[4] 递归调用是指在函数内部调用该函数本身的过程。递归调用会使得函数的调用栈不断增长,直到达到系统设定的最大栈深度或者发生栈溢出等异常情况。

[5] 递归可以让我们更清晰地理解某些问题的解法,但也有可能会导致性能问题或栈溢出等风险。在使用递归时需要注意控制递归深度和对递归出口的正确处理。

[6] 常见的递归算法包括斐波那契数列、二叉树遍历、汉诺塔问题等。使用递归时需要注意分析算法的时间复杂度和空间复杂度,避免出现性能瓶颈或内存不足等情况。

二、下面是一个使用递归计算斐波那契数列的C语言例程:

#include <stdio.h>

int fibonacci(int n) {
    if (n <= 1)
        return n;
    else
        return fibonacci(n-1) + fibonacci(n-2);
}

int main() {
    int n = 10;
    printf("斐波那契数列前%d项为:\n", n);
    for (int i = 0; i < n; i++) {
        printf("%d ", fibonacci(i));
    }
    printf("\n");
    return 0;
}

在上述代码中,我们使用递归的方式计算斐波那契数列的第n项。在递归函数fibonacci中,如果n小于等于1,我们直接返回n本身;否则,递归计算第n-1项和第n-2项的值,并将它们相加返回。递归过程会一直持续到计算到第1项或第0项,然后一步步返回到主函数中输出结果。

需要注意的是,使用递归计算斐波那契数列时,由于递归调用的次数会随着n的增大而指数级增加,所以可能会导致性能问题或栈溢出等风险。因此,在实际使用时需要适当控制递归深度和对递归出口的正确处理。

三、二叉树遍历c语言递归例程

下面是一个使用递归遍历二叉树的C语言例程,包括先序遍历(preorder)、中序遍历(inorder)和后序遍历(postorder)三种方式:

#include <stdio.h>
#include <stdlib.h>

// 二叉树节点信息
struct binarytreenode {
    int data;
    struct binarytreenode *lchild; //左子树
    struct binarytreenode *rchild; //右子树
};

// 先序遍历
void preorder(struct binarytreenode *root) {
    if (root == NULL) {
        return;
    }
    printf("%d ", root->data);
    preorder(root->lchild);
    preorder(root->rchild);
}

// 中序遍历
void inorder(struct binarytreenode *root) {
    if (root == NULL) {
        return;
    }
    inorder(root->lchild);
    printf("%d ", root->data);
    inorder(root->rchild);
}

// 后序遍历
void postorder(struct binarytreenode *root) {
    if (root == NULL) {
        return;
    }
    postorder(root->lchild);
    postorder(root->rchild);
    printf("%d ", root->data);
}

// 创建二叉树节点
struct binarytreenode *createbinarytreenode(int data) {
    struct binarytreenode *p = (struct binarytreenode *)malloc(sizeof(struct binarytreenode));
    p->data = data;
    p->lchild = NULL;
    p->rchild = NULL;
    return p;
}

int main() {
    struct binarytreenode *root = createbinarytreenode(1);
    root->lchild = createbinarytreenode(2);
    root->rchild = createbinarytreenode(3);
    root->lchild->lchild = createbinarytreenode(4);
    root->lchild->rchild = createbinarytreenode(5);
    root->rchild->lchild = createbinarytreenode(6);
    root->rchild->rchild = createbinarytreenode(7);

    printf("先序遍历结果为: ");
    preorder(root);
    printf("\n");

    printf("中序遍历结果为: ");
    inorder(root);
    printf("\n");

    printf("后序遍历结果为: ");
    postorder(root);
    printf("\n");

    return 0;
}

在上述代码中,我们首先定义了一个二叉树节点结构体binarytreenode,包括节点值data、左子树指针lchild和右子树指针rchild三个成员。然后定义了先序遍历(preorder)、中序遍历(inorder)和后序遍历(postorder)三个函数,分别用递归的方式遍历二叉树的每个节点,并按照遍历顺序输出节点值。

在主函数中,我们手动创建了一个7个节点的二叉树,并依次调用三种遍历函数。需要注意的是,在使用递归遍历二叉树时,需要判断当前节点是否为空,如果为空则直接返回;否则按照对应遍历顺序先递归遍历左子树,再输出当前节点值,最后递归遍历右子树。

四、汉诺塔问题c语言递归例程 

下面是汉诺塔问题的C语言递归例程实现:

#include <stdio.h>

// 将n个盘子从from柱子借助by柱子移动到to柱子
void move(int n, char from, char by, char to) {
    if (n == 1) { // 只有一个盘子时,直接移动到to柱子上
        printf("Move disk %d from %c to %c\n", n, from, to);
    } else { // 将n-1个盘子从from柱子借助to柱子移动到by柱子
        move(n-1, from, to, by);
        printf("Move disk %d from %c to %c\n", n, from, to);
        // 将n-1个盘子从by柱子借助from柱子移动到to柱子
        move(n-1, by, from, to);
    }
}

int main() {
    int n = 3; // 汉诺塔的圆盘数
    char A = 'A', B = 'B', C = 'C'; // 三根柱子的名称
    move(n, A, B, C); // 将n个盘子从A柱子借助B柱子移动到C柱子
    return 0;
}

在上述代码中,我们定义了一个函数move,用于将n个盘子从from柱子借助by柱子移动到to柱子。在该函数中,我们首先判断当前移动的盘子数是否为1,如果是,则直接将该盘子从from柱子移动到to柱子;否则,将n-1个盘子从from柱子借助to柱子移动到by柱子,再将第n个盘子从from柱子移动到to柱子,最后将n-1个盘子从by柱子借助from柱子移动到to柱子。在每次移动时,都输出移动的盘子编号以及移动的来源柱子和目标柱子。

在主函数中,我们定义了汉诺塔的圆盘数n和三根柱子的名称A、B、C,并调用move函数将n个盘子从A柱子借助B柱子移动到C柱子。文章来源地址https://www.toymoban.com/news/detail-474113.html

到了这里,关于递归详解,斐波那契数列、二叉树遍历、汉诺塔问题的递归代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 递归以及斐波那契数列递归算法和迭代算法的实现与分析

    程序调用自身的编程技巧称为递归( recursion) 递归有两个过程,简单地说一个是 递的过程 ,一个是 归的过程 。 递归的两个必要条件 1. 存在限制条件 ,当满足这个限制条件的时候,递归便不再继续。 2.每次递归调用之后越来越 接近这个限制条件 . 递归本质就是函数调用

    2024年02月12日
    浏览(39)
  • 基于C语言用递归思想实现斐波那契数列的函数设计

    用C语言并利用递归思想实现设计一个程序,完成斐波那契数列的函数设计,利用递归实现!

    2024年04月08日
    浏览(43)
  • 斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题

    Write once,Runanywhere. 🔥🔥🔥 本派文章详细斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题。 💥 💥 💥 如果你觉得我的文章有帮助到你,还请【关注➕点赞➕收藏】,得到你们支持就是我最大的动力!!! 💥 💥 💥 ⚡ 版权声明:本文由【马上回来了】原创、

    2023年04月08日
    浏览(67)
  • 【C/C++】斐波那契数列数列系列问题详解

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 C++初阶 🌙励志卓越可以成为你努力的动力,追求完美却只会让你身心俱疲。🌙 🍉一起加油,去追寻、去成为更好的自己!    斐波那契数列数列是我们学习递归的入门问题,是一

    2024年02月02日
    浏览(41)
  • C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

            众所周知, 斐波那契数列 是非常经典的一个数列,它的数学公式如下         为了便于观察,我们列出它的几项:0  1  1  2  3  5  8  13  21......         下面我们将介绍四种方法来用C语言计算机代码实现对斐波那契数列的求解,分别是:递归法,迭代法

    2023年04月09日
    浏览(41)
  • Java【动态规划】斐波那契数列模型, 图文思路详解 + 代码实现

    本篇总结动态规划中的 斐波那契数列模型 的解法和思路 按照以下流程进行分析题目和代码编写 思路分析步骤 代码编写步骤 1, 状态表示 1, 构造 dp 表 2, 状态转移方程 2, 初始化+边界处理 3, 初始化 3, 填表(抄状态转移方程) 4, 填表顺序 4, 返回结果 5, 返回值 / OJ链接 题目分析

    2024年02月08日
    浏览(59)
  • Python斐波那契数列

    斐波那契数列是一个经典的数学问题,在 Python 中可以使用多种方法来实现,下面是几个常见的实现方式: 1. 使用递归 ```python def fibonacci_recursive(n):     if n = 1:         return n     else:         return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) ``` 2. 使用循环 ```python def fibonacci_i

    2024年02月02日
    浏览(46)
  • 斐波那契数列应用2

    目录 斐波那契数列应用2 程序设计 程序分析  系列文章 【问题描述】定义如下序列:f(1)=1,f(2)=1;f(n)=(A*f(n-1)+B*f(n-2))mod7     给定A和B,请你计算f(n)的值。 【输

    2023年04月10日
    浏览(55)
  • JAVA-斐波那契数列

    输入一个整数 n ,求斐波那契数列的第 n 项。 假定从 0 开始,第 0 项为 0 。 数据范围 0≤n≤39 样例

    2024年02月10日
    浏览(53)
  • 矩阵快速幂&斐波那契数列

    矩阵快速幂: 快速地求出斐波那契数列中的每一项 可以快速地求出斐波那契数列的前n项的和 首先我们来看如何快速地求出斐波那契数列的第n项 设 F n = [ f n , f n + 1 ] F_n = [f_n,f_{n+1}] F n ​ = [ f n ​ , f n + 1 ​ ] ,构造这一个行向量,那么对于此,我们思考 F n F_n F n ​ 乘一个

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包