文档章节

Java递归专题

南风末
 南风末
发布于 2017/04/16 07:51
字数 1560
阅读 0
收藏 0

170415    递归_2方法执行时分配内存空间 

package DiGuiPrepare;

public class DiGui 
{
	
	
	//递归
	
	public static void a()
	{
		System.out.println("a");
		b();
		System.out.println("c");
	}
	
	public static void b()
	{
		System.out.println("b");
	}
	
	//方法在执行时内存做了什么
	//没个方法的每次执行,java虚拟机都会为这个方法在栈内存中分配一块单独不共享的内存空间
	//当一个方法执行完成的时候,虚拟机就会回收这个方法这次执行分配的内存空间
	public static void main(String[] agrs)
	{
		c();
	}
	
	public static void c(){
		int i=1;
		d();//执行完就被回收
		System.out.println(i);//结果为1
	}
	
	public static void d()
	{
		int i = 5;//局部变量,作用在局部
		
	}
}

170415    递归_3递归定义和返回条件

package DiGuiPrepare;

public class DiGui1
{
	//递归的定义:方法自己调用自己
	
	public static void a()
	{
		a();
	}
	
	//如果递归方法不加限制(方法没有返回的时候),程序最终肯定会抛出异常(staticOverflowError)
	//递归重要特点要有返会条件
	
	public static void jianggushi(int i)
	{
		System.out.println(i+"从前有个庙……");
		
		if(i==100)
		{
			return ;
		}
		i++;
		jianggushi(i);
	}
	
	public static void main(String[] args)
	{
		jianggushi(1);
	}
	
}

170415    递归_5求自然数n的阶乘

package DiGuiPrepare;

public class jiecheng
{
	//编写一个方法求 自然数 n 的阶乘
	
	//求自然数n的阶乘
	//n! = n*(n-1);
	
	//递推条件:n*jiecheng(n-1);
	//返回条件:n==0
	
	public static int jiecheng(int n)
	{
		//返回条件
		if(n==0)
		{
			return 1;
		}
		
		//递推条件
		int jiechengN = n*jiecheng(n-1);
		return jiechengN;
	}
	
	public static void main(String[] args)
	{
		int n=5;
		int jiechengN=jiecheng(n);
		System.out.println(jiechengN);
	}
	
	

}


170415    递归_6非递归方式求阶乘

package DiGuiPrepare;

public class jiecheng
{
	//编写一个方法求 自然数 n 的阶乘
	
	//求自然数n的阶乘
	//n! = n*(n-1);
	
	//递推条件:n*jiecheng(n-1);
	//返回条件:n==0
	
	public static int jiecheng(int n)//递归方法,没调用一次,开辟一块内存空间
	{
		//返回条件
		if(n==0)
		{
			return 1;
		}
		
		//递推条件
		int jiechengN = n*jiecheng(n-1);
		return jiechengN;
	}
	
	//非递归方法求阶乘
	public static int jiecheng2(int n)
	{
		
		if(n==0)
		{
			return 1;
		}
		int jiechengN = 1;
		for(int i= 1;i<=n;i++)
		{
			jiechengN*=i;
		}
		return jiechengN;
	}
	
	//递归方式和非递归方式的比较
	//递归方式缺点:内存开销大,性能不高
	//递归方式优点:代码实现非常简洁
	
	//满足尾递归,两者可以相互转化
	public static void main(String[] args)
	{
		int n=5;
		int jiechengN=jiecheng(n);
		int jiecheng2N=jiecheng(n);
		System.out.println(jiechengN);
		System.out.println(jiecheng2N);
	}
	
	

}


尾递归:函数返回之前的最后一个操作若是递归调用,则该函数是尾函数。

int facttail(int n,int a)
	{
		if(n<0)
		{
			return 0;
		}
		else if(n==0)
		{
			return 0;
		}
		else if(n==1)
		{
			return 1;
		}
		else
		{
			return facttail(n-1,n*a);
		}
	}

170415   递归_7斐波那契数

package DiGuiPrepare;

public class Fib
{

	public static void main(String[] args)
	{
		int fibN = fib(5);
		System.out.println(fibN);

	}
	
	//斐波那契数  0,1,1,2,3,5,8,13,……f(n-2),f(n-1),f(n-2)+f(fn-1)
	//f(n)=f(n-2)+f(fn-1)(n>=2)
	//写一个方法,求第n(n>=0)个fib数
	
	//求第n(n>=0)个fib数
	
	//递推条件:f(n)=f(n-2)+f(fn-1)(n>=2)
	//结束条件:n==0||n==1
	public static int fib(int n)
	{
		//结束条件:
		if(n==0)
		{
			return 0;
		}
		if(n==1)
		{
			return 1;
		}
		return fib(n-1)+fib(n-2);
	}
	


}

170415   递归_8非递归方式请斐波那契数 

package DiGuiPrepare;

public class Fib
{

	public static void main(String[] args)
	{
		int n=6;
		int fibN = fib(n);
		int fib2N = fib2(n);
		System.out.println(fibN);
		System.out.println(fib2N);

	}
	
	//斐波那契数  0,1,1,2,3,5,8,13,……f(n-2),f(n-1),f(n-2)+f(fn-1)
	//f(n)=f(n-2)+f(fn-1)(n>=2)
	//写一个方法,求第n(n>=0)个fib数
	
	//求第n(n>=0)个fib数
	
	//递推条件:f(n)=f(n-2)+f(fn-1)(n>=2)
	//结束条件:n==0||n==1
	public static int fib(int n)
	{
		//结束条件1
		if(n==0)
		{
			return 0;
		}
		//结束条件2
		if(n==1)
		{
			return 1;
		}
		//递推条件
		return fib(n-1)+fib(n-2);
	}
	
	//非递归方法求第n个斐波那契数
	//f(n)=f(n-2)+f(fn-1)(n>=2)
	//{ 0,1,1,2,3,5,8}
	//定义一个int数组,把前两个元素的值搞定,然后使用一个循环,一次从2到n给相应位置的元素赋值
	public static int fib2(int n)//n代表数组个数
	{
		int [] arr= new int[n+1];
		arr[0] = 0;
		arr[1] =1;
		for(int i=2;i <=n;i++)
		{
			arr[i] = arr[i-1]+arr[i-2];
		}
		return arr[n];
	}
	


}

170415    9、常量池 

package DiGuiPrepare;

public class Changliangchi
{
	
		//常量吃
		//在编译时期就可确定的数据,会被放入到常量池中
		//编译器会对代码进行优化
		
		//1、存放类文件的信息:类名,包名,字段名称类型,方法名……
		//2、存放static final字段
		//3、存放字符串常量
		//4、存放基本类型包装类的对象,除了float和double两个浮点类型
		
		public static void main(String[] args)
		{
			//在编译时期就可确定的数据,会被放入到常量池中->指向同一对象
			//String s1="abc";
			//String s2="abc";
			//System.out.println(s1==s2);//true
			
		//	String s6 = "ab";
			//String s7 ="a"+"b";//编译时就是常量
			//System.out.println(s6==s7);
		/*	
			String s8 =new String("ab");
			String s9 = "ab";
			System.out.println(s8==s9);//false*/
			
			Integer i1=1;//调用valueOf方法进行装箱    offset(偏移量)
			Integer i2=1;//i>127时,编译器会new出一个新对象(-128到127个)//Character 的常量范围是[0-127]
			System.out.println(i1==i2);//true
			
		
		
		
		
		}
	
}

170416  专题课1> 10、字符_编码_ASCII编码表

package DiGuiPrepare;

public class Test1
{

	public static void main(String[] args)
	{
		char ch = 'a';
		
		//1 查看字符'a'对应的整数
		
		System.out.println((int)'a');
		System.out.println('a');
		
		//2 char类型整数的范围
		//java中char的范围是0~65535
		
		System.out.println((int)Character.MIN_VALUE);
		System.out.println((int)Character.MAX_VALUE);
		
		
	}

}

170416     专题课1> 11、拆数

package DiGuiPrepare;

public class Chaishu
{
	//拆数
	//345
	//把一个数每个位上的数字依次取出来就是拆数
	public static void main(String[] args)
	{
		/*int num = 345;
		
		//个位上的数 5
		int ge = num%10;
		System.out.println(ge);
		
		//如何取十位上的数字4
		//思路:把十位上的数字移动到最右边
		num=num/10;//(先取整,)
		int shi = num%10;//(再取余)
		System.out.println(shi);
		
		//如何取3
		//num=34
		num=num/10;
		int bai = num%10;
		System.out.println(bai);*/
		
		chaishu(456);
		
	}
	
	//写一个方法,把传过去的整数拆开并输出
	public static void chaishu(int num)
	{
		while(true)
		{
			//把最右边的数取出来
			int right = num%10;
			System.out.println(right);
			
			//把最右边的数丢弃掉
			num=num/10;
			if(num==0)
			{
				//拆到头了,再差下去就没有意义了
				break;
			}
			
		}
	}
	
	
	
	
	
	
	
	
	
	
}

 

 

© 著作权归作者所有

南风末
粉丝 6
博文 228
码字总数 313035
作品 0
南昌
程序员
私信 提问
Java 8 停止维护,Java 9 难产,IDEA 2018 发布,还有……

祝大家五一劳动节快乐,工作顺利! 又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,各种送书抽奖福利,各种面试题分享,各种最新动态资讯等。 - 5.1重磅活动 区块链免费送...

Java技术栈
2018/04/30
0
0
Java程序员从笨鸟到菜鸟之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader

欢迎阅读本专题的其他博客: 深入java虚拟机(一)——java虚拟机底层结构详解 深入java虚拟机(二)——类的生命周期(上)类的加载和连接 深入java虚拟机(三)——类的生命周期(下)类的初...

长平狐
2012/11/12
156
0
牛逼哄哄的Dubbo框架,底层到底是什么原理?

搞了N年Java,仍有不少朋友困惑:用了很多年Dubbo,觉得自己挺厉害,跳槽面试时一问RPC,一问底层通讯,一问NIO和AIO,就一脸懵逼,到底该怎么办? (大家有没有这样的感触?Dubbo用得很熟,...

Java猫
03/27
0
0
七夕节福利,一套java架构师资源等你拿

精彩内容 java实战练习项目教程 全网最全电子图书分享 你所需要的大数据视频教程 java学习视频教程及源码 七夕节了,所以思海同学想着,在七夕节之前给大家先带来一些福利,希望对大家有帮助...

公众号_好好学java
2018/08/17
0
0
11月编程语言排行:Java第一Python第四,世界上最好的语言两个零

     排行有什么用?那当然是作为风向标用。透过排行,我们也可以从中发现就业趋势。11月份,java依然稳坐编程语言第一。   Java仍然稳坐第一名宝座,傲视群雄。      所以下面这些...

java进阶架构师
2017/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机网络

计算机网络体系结构 OSI 其中表示层和会话层用途如下: 表示层 :数据压缩、加密以及数据描述,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。 会话层 :建立及管理会话。 五层...

一只小青蛙
今天
2
0
0.01-Win10安装linux子系统

一、安装Debian子系统 -1、控制面板设置: -1.1、打开“控制面板” —— “程序” —— “启用或关闭Windows功能” —— 勾选 “适用于Linux的Windows子系统” -2、设置: -2.1、打开“设置”...

静以修身2025
昨天
2
0
init 0-6 (启动级别:init 0,1,2,3,4,5,6)

启动级别: init 0,1,2,3,4,5,6 这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下。。 0: 停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system...

圣洁之子
昨天
2
0
Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转...

天王盖地虎626
昨天
2
0
聊聊Elasticsearch的ProcessProbe

序 本文主要研究一下Elasticsearch的ProcessProbe ProcessProbe elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/process/ProcessProbe.java public class ProcessProb......

go4it
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部