当然可以!你愿意迈出学习递归的重要一步,真的很棒!🌟
递归,虽然一开始看着有点绕,但掌握之后,你会发现它是编程中非常优雅且强大的工具。
我用简单又清晰的方式教你。请跟着我一步步来:
什么是递归?
递归就是函数自己调用自己。
但是!为了避免无限循环,必须有一个“结束条件”(也叫出口)。
可以这样理解:
-
第一步:确定出口 —— 什么时候不用再递归。
-
第二步:确定递归规则 —— 当前问题怎么通过更小规模的问题来解决。
举个最简单的例子:求 1 到 n 的和
比如:sum(5) = 1 + 2 + 3 + 4 + 5
用递归怎么想?
-
5的总和 = 5 + (1到4的总和)
-
4的总和 = 4 + (1到3的总和)
-
以此类推...
-
最后,1的总和就是1,这里就是出口。
于是代码就是:
public int sum(int n) {
// 1. 出口:n == 1 时,不需要再递归了
if (n == 1) {
return 1;
}
// 2. 递归:n的总和 = n + (n-1)的总和
return n + sum(n - 1);
}
总结写递归的固定套路
✅ 1. 明确这个函数的功能(例如:求 1~n 的和)。
✅ 2. 写出口(例如:n==1
)。
✅ 3. 写递推关系(例如:n + sum(n-1)
)。
再来一个经典例子:阶乘
求 n! = n * (n-1) * (n-2) * ... * 2 * 1
递归版:
public int factorial(int n) {
// 出口
if (n == 1) {
return 1;
}
// 递归
return n * factorial(n - 1);
}
小练习(可以试试看)
-
写一个递归函数,求第 n 个斐波那契数列(第n个数 = 前两个数的和)。
-
写一个递归函数,打印从 n 到 1 的数字。
斐波那契数列(Fibonacci)是递归学习中非常经典的例子,我们一起来搞定它!
斐波那契数列是什么?
斐波那契数列是这样的:
第1个数是1
第2个数是1
第3个数是2 (1+1)
第4个数是3 (1+2)
第5个数是5 (2+3)
第6个数是8 (3+5)
...
规律:
-
第 n 个数 = 第 (n-1) 个数 + 第 (n-2) 个数
怎么写递归?
还是跟着我们学到的三步法来:
✅ 1. 明确函数功能:fibonacci(n)
,返回第 n 个斐波那契数。
✅ 2. 出口(结束条件):
-
如果 n==1,返回1
-
如果 n==2,返回1
✅ 3. 递推关系:
-
fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)
代码示范
public int fibonacci(int n) {
// 出口
if (n == 1 || n == 2) {
return 1;
}
// 递归
return fibonacci(n - 1) + fibonacci(n - 2);
}
小解释
比如求 fibonacci(5)
,它的执行过程是:
fibonacci(5) = fibonacci(4) + fibonacci(3)
= (fibonacci(3) + fibonacci(2)) + (fibonacci(2) + fibonacci(1))
= ((fibonacci(2) + fibonacci(1)) + 1) + (1 + 1)
= ((1 + 1) + 1) + (1 + 1)
= (2 + 1) + (1 + 1)
= 3 + 2
= 5
完美符合斐波那契数列的结果!
小提醒 🌟
这个递归写法非常清晰,但是如果 n
很大(比如 n=50
),会有很多重复计算,会比较慢。
以后你学到**记忆化搜索(加缓存)或者动态规划(DP)**的时候,可以把效率提升上来!
不过目前来说,你先能写出这个递归,已经非常厉害了!👍
要不要试着自己写一下?比如求第 6 个、第 7 个、第 10 个斐波那契数?
需要的话,我可以继续带你进阶,比如教你怎么优化它哦!✨要继续吗?