欲了解递归,必先掌握函数(方法),函数(方法)是递归得外衣。
方法的执行和返回
/**
* 用于说明简单的函数调用的顺序
*/
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);
}
}