递归(java)

package com.cwq.ch06;

/** 
 * 递归
 * 斐波那契数列
 * F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
 * 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
 * @author Carpoor  
 * @date 2019年2月15日 
 */
public class Test {

	public static void main(String[] args) {
		for (int i = 1; i < 15; i++) {
			System.out.println("========="+i);
			System.out.println(getNumber(i));
		}
		
	}
	
	public static int getNumber(int n) {
		if (n == 1) {
			return 1;
		}
		if (n == 2) {
			return 1;
		}
		
		return getNumber(n-1) + getNumber(n-2);
	}
	
}

### Java递归的概念 递归是指函数在其定义中直接或间接调用自身的编程技术。这种自我调用允许算法通过分解成更小的子问题来解决复杂问题[^2]。 #### 递归的工作原理 从栈的角度来看,递是进栈的过程,在每次递归调用时都会创建一个新的执行上下文并压入调用栈;而归则是出栈过程,当达到终止条件后,这些被压入堆栈中的上下文依次弹出完成剩余的操作[^1]。 ### 递归的应用场景 递归非常适合处理具有自然层次结构的数据或者可以分割为相似子任务的问题。常见的应用场景包括但不限于: - **数学运算**:如计算阶乘、斐波那契数列等。 - **数据结构操作**:比如树形结构上的遍历(前序、中序、后续)、图论中的深度优先搜索DFS。 - 文件系统的遍历也是典型的例子之一,可以通过递归来访问目录及其嵌套下的所有文件和子目录[^4]。 ### 实现递归的关键要素 为了成功实现递归逻辑,通常需要考虑以下几个方面: - **基准情况(Base Case)**:这是停止递归的基础情形,用于防止无限循环的发生。对于阶乘而言,`if(n == 1)` 就是一个合适的基准案例[^3]。 - **递推关系(Recursive Relation)**:描述如何基于较小规模的结果构建更大规模解的方式。例如,在阶乘的例子中,`return n * getMul(n - 1);` 表达了当前层与下一层之间的联系。 ### 示例代码解析 下面给出一段简单的Java代码片段用来演示如何使用递归来反转字符串以及计算阶乘: ```java // 反转字符串 public static void reverse(int index, String str){ if (index == str.length()){ return; } reverse(index + 1, str); System.out.print(str.charAt(index)); } ``` 这段代码展示了如何利用递归来逐个字符地打印输入字符串的逆序版本。注意这里的递归调用发生在实际输出之前,因此实现了先深入到底部再逐步回溯的效果。 ```java // 计算阶乘 public int factorial(int number) { if(number == 0 || number == 1) { // 基准情况 return 1; } else { return number * factorial(number - 1); // 递推关系 } } ``` 此段代码则说明了一个标准的递归方式去求取给定整数的阶乘值。它首先检查是否达到了最底层(`number == 0 or 1`),如果是,则返回基础结果;如果不是,则继续向下传递直到触及底部,并在此过程中累积最终答案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值