【JavaSE基础】专题-递归

欲了解递归,必先掌握函数(方法),函数(方法)是递归得外衣。

方法的执行和返回

/**
*	用于说明简单的函数调用的顺序
*/
public class Demo
{
	public static void main(String[] args)
	{
		a();
	}
	public static void a()
	{
		System.out.println("A");
		b();
		System.out.println("C");
	}
	public static void b()
	{
		System.out.println();
	}
}

图解方法调用过程

方法执行时的内存分配

/**
*	用于说明方法执行的内存分配问题
*	其中关于只涉及到栈的说明(更多的之后案例中会呈现的)
*/
public class Demo
{
	public static void main(String[] args)
	{
		int i = 1; 
		c();
		System.out.println(i);
	}
	public static void c()
	{
		d();
	}
	public static void d()
	{
		int i = 5;
	}
}

// 最终的输出结果是  1(而不是5)

图解方法执行时的内存分配问题

递归概述

图解递归相关

阶乘的迭代和递归实现

迭代实现

/**
 *	需求:已知   斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2)
 *		斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、...
 *		求出第n个斐波那契数
 *
 *	分析:
 *		1、设F(0)为 a(a=0),设F(1)为b(b=1)
 *		2、递推得到F(2)=b+a;F(3)=(b+a)+b .....
 *		3、总结规律:
 *			n = 0 时	F(0) = a;
 *			n = 1 时	F(1) = b;
 *
 *			当n >=2 时
 *				F(2) =   b	+	a
 *				F(3) = (b+a)	+	a
 *				-------------------------
 *				下一项的等式右面的第一个数 等于上一项的等式右面之和
 *				下一项的等式右面的第二个数 等于上一项的等式右面第一项
 *
 *	编码实现:FibForDemo类--注意  n 为负整数的情况
 *
 */

import java.util.Scanner;

public class FibForDemo
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);

		System.out.println("请输入一个非负整数n:");
		long n = sc.nextLong();  // 接收用户的输入

		if(n < 0)
		{
			System.out.println("请输入一个非负整数!");
			return;
		}
		long a = 0;  //  记录 F(0)
		long b = 1;  //  记录 F(1)
		//1、 设置 fib的初始值(不可以使用0、1,因其有特殊意义)	
		long fib = -1;
		//2、判断当前输入是否为0
		if(n == 0)
		{
			fib = a;  // fib为F(0),即为a
		}
		//3、判断当前输入是否为1
		if(n == 1)
		{
			fib = b;  // fib为F(1),即为b
		}
		//4、判断当前输入是否为>=2
		if(n >= 2)
		{
			for(long i = 2; i <= n; i++)
			{
				fib = a + b;	// F(2)=F(0)+F(1) 
				long t = b;	// 获取上一项的等式右面的第一项(防止被新值覆盖)
				b = a + b;	// 获取下一项的等式右面的第一项
				a = t;		// 获取下一项的等式右面的第二项
			}
		}
		//4、执行打印
		System.out.println("第 "+n+" 位的斐波那契数为:"+fib);
	}
}

递归实现

import java.util.Scanner;
/**
*	需求:根据用户的输入n,求n的阶乘(n!=n*(n-1)*(n-2)*2*1)
*	分析:1、导入Scanner类所在命名空间,实现接受用户的输入
*	      2、根据递归使用的必要条件:
*		(1)子问题和原问题做同样的事情:求积
*		(2)边界条件
*	     		已知:1!=1
*	 	 	假设求 5!
*				第一步:5*4!
*					转化为求4!  第二步:4*3!
*						转化为求3!  第三步:3*2!
*							转化为求2!  第三步:2*1!
*							因为一直1!=1 所以  2!的可以知道,以此类推得到5!的值
*
*		(3)从上述的分析中可知:满足递归使用的必要条件,所以使用递归实现
*		(4)获取递归三要素:
*			-- 边界条件(递推条件):1! =1
*			-- 递归前进段(n != 1):n * (n-1)!
*			-- 递归返回段(n == 1):1
*
*
*	      3、实现时,注意异常情况的处理
*
*	编码实现:JieChengRecursionDemo类--递归实现
*/
public class JieChengRecursionDemo
{
	public static void main(String[] args) {
		// 1、定义变量 n 接受用户输入
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入正整数n:");
		int n = sc.nextInt();

		// 2、验证用户输入数字的合法性(是否为正整数)
		if (n <= 0) {
			System.out.println("请输入正整数!");
			return;
		}

		// 3、调用函数jC实现
		int jc = jC(n);

		// 4、输出n的阶乘
		System.out.println("n的阶乘是:"+jc);
	}

	// 定义实现阶乘的函数   -- Recursion
	public static int jC(int n)
	{
		if(n == 1)
		{
			return 1;
		}
		
		return n * jC(n-1);
	}
}

斐波那契迭代和递归实现

迭代实现

/**
*	需求:已知   斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2)
*		斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、...			
*		求出第n个斐波那契数
*	
*	分析:
*		1、设F(0)为 a(a=0),设F(1)为b(b=1) 
*		2、递推得到F(2)=b+a;F(3)=(b+a)+b ..... 
*		3、总结规律:
*			n = 0 时	F(0) = a;
*			n = 1 时	F(1) = b;
*
*			当n >=2 时
*				F(2) =   b	+	a
*				F(3) = (b+a)	+	a
*				-------------------------
*				下一项的等式右面的第一个数 等于上一项的等式右面之和
*				下一项的等式右面的第二个数 等于上一项的等式右面第一项
*
*	编码实现:FibForDemo类--注意  n 为负整数的情况
*
*/

import java.util.Scanner;

public class FibForDemo
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);

		System.out.println("请输入一个非负整数n:");
		long n = sc.nextLong();  // 接收用户的输入

		if(n < 0)
		{
			System.out.println("请输入一个非负整数!");
			return;
		}

		long a = 0;  //  记录 F(0)
		long b = 1;  //  记录 F(1)
	
		//1、 设置 fib的初始值(不可以使用0、1,因其有特殊意义)	
		long fib = -1; 
		//2、判断当前输入是否为0
		if(n == 0)
		{
			fib = a;  // fib为F(0),即为a
		}
		
		//3、判断当前输入是否为1
		if(n == 1)
		{
			fib = b;  // fib为F(1),即为b
		}

		//4、判断当前输入是否为>=2
		if(n >= 2)
		{
			for(long i = 2; i <= n; i++)
			{
				fib = a + b;	// F(2)=F(0)+F(1) 
				long t = b;	// 获取上一项的等式右面的第一项(防止被新值覆盖)
				b = a + b;	// 获取下一项的等式右面的第一项
				a = t;		// 获取下一项的等式右面的第二项
			}
		}
		//5、执行打印
		System.out.println("第 "+n+" 位的斐波那契数为:"+fib);
	}
}

图解斐波那契数列非递归实现

递归实现

/**
*	需求:已知   斐波那契的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2)
*		斐波纳契数列 这样的一个数列:0、1、1、2、3、5、8、13、21、...			
*		求出第n个斐波那契数
*	
*	分析:分析过程详细见 递归8.png图片
*		
*	编码实现:FibRecursionDemo类--注意  n 为负整数的情况
*	
*		函数实现fib的第n项
*/

import java.util.Scanner;

public class FibRecursionDemo
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);

		System.out.println("请输入一个非负整数n:");
		long n = sc.nextLong();  // 接收用户的输入

		if(n < 0)
		{
			System.out.println("请输入一个非负整数!");
			return;
		}

		// 函数调用实现fib求解
		long fib = fib(n);

		// 执行打印
		System.out.println("第 "+n+" 位的斐波那契数为:"+fib);
	}
	
	// 接受用户输入的非负整数n求解斐波那契数
	// 当数字n为负整数时,在main方法中进行异常处理
	//	 主要是为了让方法专注于特定功能的实现
	public static long fib(long n)
	{
		// 当 n 为 0、1 时,直接返回
		if(n == 0 )
		{
			// 递归返回段1
			return 0;	
		}
		if(n == 1 )
		{
			// 递归返回段2
			return 1;
		}
		
		/* 边界条件(递推条件)  n >= 2
		   当 n >= 2 时,进行递归处理
		   递归前进段  
		*/
		return fib(n - 1) + fib(n - 2);
	}
}

图解斐波那契数列递归实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老坛算粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值