美文网首页
递归的使用1

递归的使用1

作者: 雯饰太一 | 来源:发表于2023-06-15 06:59 被阅读0次

递归的使用

目前个人遇到过的几种情况

//不带有任何返回参数的递归,通常闭合条件是内定的
void Fun(T* tObj)
{
    if(/*some case*/)
    {
        Fun(newObj);
    }
}

//没有返回参数,但是可以通过一个递归外的量作为退出条件,或作为回收统计机制
void Fun(T* tObj,T2& set1,T3& set2)
{
     if(/*some case*/)
    {
        Fun(newObj, set1, set2);
    }
}

//具备返回值的递归
int Fun(T* a,T* b)
{
    return Fun(a->left, a->right) + Fun(b->left, b->right);
}

其他一些递归的案例

阶乘计算

计算一个正整数的阶乘。例如,n! = n * (n-1) * (n-2) * ... * 1。可以使用递归来计算阶乘,通过将问题分解为更小的子问题。

当计算一个正整数的阶乘时,可以使用递归实现。下面是一个示例代码,演示了如何使用递归来计算阶乘:

#include <iostream>

unsigned long long factorial(unsigned int n) {
    // 递归终止条件:当 n 为 0 或 1 时,阶乘为 1
    if (n == 0 || n == 1) {
        return 1;
    }
    
    // 递归调用,将问题分解为较小的子问题
    return n * factorial(n - 1);
}

int main() {
    unsigned int num;

    std::cout << "Enter a positive integer: ";
    std::cin >> num;

    unsigned long long result = factorial(num);
    std::cout << "Factorial of " << num << " is " << result << std::endl;

    return 0;
}

在上述代码中,factorial 函数使用递归方式计算阶乘。当 n 为 0 或 1 时,递归终止,直接返回 1。否则,递归调用 factorial 函数来计算 (n-1) 的阶乘,并将结果乘以 n,得到 n! 的值。在 main 函数中,用户输入一个正整数,然后调用 factorial 函数来计算其阶乘,并将结果输出。

斐波那契数列

计算斐波那契数列的第 n 个数字。斐波那契数列的定义是,前两个数字是 0 和 1,后续的数字是前两个数字的和。可以使用递归来计算斐波那契数列,通过将问题分解为两个较小的子问题。下面是一个示例代码,展示了如何使用递归来计算斐波那契数列的第 n 个数字:

#include <iostream>

unsigned long long fibonacci(unsigned int n) {
    // 递归终止条件:当 n 为 0 或 1 时,斐波那契数为 n
    if (n == 0 || n == 1) {
        return n;
    }
    
    // 递归调用,将问题分解为两个较小的子问题
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    unsigned int num;

    std::cout << "Enter a positive integer: ";
    std::cin >> num;

    unsigned long long result = fibonacci(num);
    std::cout << "Fibonacci number at position " << num << " is " << result << std::endl;

    return 0;
}

在上述代码中,fibonacci 函数使用递归方式计算斐波那契数列的第 n 个数字。当 n 为 0 或 1 时,递归终止,直接返回 n。否则,递归调用 fibonacci 函数来计算第 n-1n-2 个数字的斐波那契数,并将两者相加得到第 n 个数字。在 main 函数中,用户输入一个正整数,然后调用 fibonacci 函数来计算斐波那契数列中对应位置的数字,并将结果输出。

注意

请注意,递归实现中,递归深度会随着输入值的增加而增加,可能导致堆栈溢出。因此,在实际使用递归时,需要注意递归深度的限制,或者考虑使用迭代方法来替代递归。

递归是一种编程技巧,它可以解决许多问题,但也存在一些优劣之处。

优点:

  1. 简洁清晰:递归可以将复杂的问题拆分成更小的子问题,使代码结构更加清晰、简洁。

  2. 可读性强:递归的代码通常具有良好的可读性,因为它可以直接反映问题的本质,使得代码更易于理解和维护。

  3. 解决特定问题:某些问题天然适合使用递归来解决,例如树结构、图遍历等。
    缺点:

  4. 性能开销:递归调用涉及函数的堆栈操作,可能会占用大量的内存和额外的时间。递归深度过大时,可能导致堆栈溢出。

  5. 可能引发重复计算:某些递归算法可能会重复计算相同的子问题,导致效率低下。可以通过记忆化技术(如动态规划)来解决这个问题。

  6. 可能导致代码难以理解和调试:过度的递归调用可能导致代码变得复杂,难以理解和调试。在处理复杂问题时,递归的控制流可能变得难以追踪。

注:关于动态规划,后期会逐渐提到

相关资源

以下是一些常用的数据结构可视化网站:

  1. Visualgo: https://visualgo.net/zh - 提供了各种数据结构和算法的可视化演示,包括数组、链表、树、图等。

  2. Data Structure Visualizations: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html - 提供了多种数据结构和算法的可视化演示,包括栈、队列、堆、排序算法等。

  3. Algorithm Visualizer: https://algorithm-visualizer.org/ - 提供了多种数据结构和算法的可视化演示,包括树、排序算法、图算法等。

引入几个,其他功能的网站,如下:

https://www.bejson.com/runcode/cpp920/ 这是一个在线运行代码的网站
https://codebeautify.org/cpp-formatter-beautifier 可以在线美化代码

相关文章

  • 浅实现一下,Array.flatten(Infinity)的降维

    1. 使用for循环+递归 2. reduce + 递归

  • go递归

    1.递归的使用 使用递归快速排序 2.关于递归上下文的测试 运行的结果如下:

  • 递归

    Python 3 : 1、使用递归实现倒计时 2、使用递归实现列表元素相加 3、使用递归计算列表包含的元素数 4、...

  • 数据结构----递归

    1.使用递归实现阶乘 2.用递归求和(普通实现方式) 3.另一种递归求和实现 4.循环和递归的优缺点 使用递归能实...

  • 数据结构-递归

    递归定义:递归(Recursion)是指在函数的定义中使用函数自身的方法 递归使用的3个条件: 1.问题可以拆解成...

  • Java 使用递归遍历、删除、搜索某目录下文件

    1、使用递归遍历D:\a目录下所有的文件或文件夹 2、使用递归删除D:\a目录下所有的文件或文件夹 3、使用递归搜...

  • 代码规范--树形项目

    1.递归如何停止? 2.递归是否有返回值? 3.平铺和递归的使用场景?

  • leetcode刷题之递归

    leetcode刷题,使用python 1, 相同的树—— 0110 递归 自顶向下的递归和自底向上的递归给定...

  • Java实例-目录操作

    1、Java 实例 - 递归创建目录:使用 File 类的 mkdirs() 实现递归创建目录。 public c...

  • 二叉树算法之0-计算二叉树的深度

    算法思想:使用递归 算法解析:分别递归左树和右树,递归到叶子节点时返回0,递归回溯时值+1,不断累积回溯的深度,每...

网友评论

      本文标题:递归的使用1

      本文链接:https://www.haomeiwen.com/subject/vapredtx.html