您的位置:首页 > 编程语言 > Java开发

Java语言基础1--专题课 递归

2015-07-15 22:36 615 查看

第1节:方法的执行和返回

/**
*   用于说明简单的函数调用的顺序
*/
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();
}
}




第2节:方法执行时的内存分配

/**
*   用于说明方法执行的内存分配问题
*   其中关于只涉及到栈的说明(更多的之后案例中会呈现的)
*/
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)




第3&4节:递归概述



第5&6节:阶乘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;      // 获取下一项的等式右面的第二项
}
}
//4、执行打印
System.out.println("第 "+n+" 位的斐波那契数为:"+fib);
}
}


2)递归实现

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);
}
}


第7&8节:斐波那契的非递归和递归实现

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);
}
}




2)递归实现

/**
*   需求:已知   斐波那契的定义是: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);
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: