什么是递归?
是递“龟”吗?No,no!
给你们讲个故事
从前有个小博客,博客里有个up猪,up猪给大家讲故事,故事说从前有个小博客,博客里有个up猪,up猪给大家讲故事,故事说从前有个小博客,博客里有个up猪.........
这个故事有个特点,在故事中提到同样的故事。
而这就是递归的核心理念了
函数就像一个故事,函数中调用自己就是递归
好了回到编程领域,递归是一种编程技术,它允许函数调用自身来解决问题。递归通常用于解决可以被分解为相同类型的较小问题的问题。递归函数通常包含两个部分:
- 基本情况:这是递归的终止条件,当满足这个条件时,函数不再调用自身,而是直接返回结果
- 递归情况:这是函数调用自身的地方,通过将问题分解为更小的子问题来实现(如下图)
递归的一个经典例子是计算阶乘。阶乘的定义是:
- n!=n×(n−1)×(n−2)×…×1n!=n×(n−1)×(n−2)×…×1
- 基本情况是 0!=1
c++代码框架
#include <iostream>
using namespace std;
// 递归函数计算阶乘
int factorial(int n) {
// 基本情况
if (n == 0) {
return 1;
}
// 递归情况
else {
return n * factorial(n - 1);
}
}
int main() {
int n = 5;
cout << "Factorial of " << n << " is " << factorial(n) << endl;
return 0;
}
python代码框架
# 递归函数计算阶乘
def factorial(n):
# 基本情况
if n == 0:
return 1
# 递归情况
else:
return n * factorial(n - 1)
# 测试
n = 5
print(f"Factorial of {n} is {factorial(n)}")
详细说明
- 基本情况:在上述代码中,
if (n == 0)
或if n == 0
是基本情况。当n
为 0 时,函数直接返回 1,不再进行递归调用。 - 递归情况:在
else
分支中,函数调用自身factorial(n - 1)
,将问题规模缩小,直到达到基本情况。
递归的优缺点
- 优点:递归可以使代码更简洁、更易读,特别是对于那些可以自然分解为子问题的问题。
- 缺点:递归可能会导致栈溢出,因为每次递归调用都会增加栈的深度。此外,递归有时不如迭代效率高,因为每次递归调用都需要保存当前的执行上下文。
递归的应用
递归广泛应用于各种算法和数据结构中,例如:
- 树的遍历:前序、中序、后序遍历。
- 图的遍历:深度优先搜索(DFS)。
- 分治算法:如快速排序、归并排序。
- 动态规划:如斐波那契数列、背包问题。
通过理解递归的基本原理和应用,可以更好地设计和实现高效的算法
所以你学会了吗,还没学会就......
关注