#Java算法设计与分析1–递归算法

#Java算法设计与分析1–递归算法1.递归算法1.1递归的概念所谓递归,就是程序方法在运行过程中自身调用自身。定义如下所示。fn(){ if(递归出口条件){ returnx;}else{ //somecodes…returnfn();}}1.2递归的使用条件1.2.1必须要有明确的递归出口所谓递归出口就是需要有明确的结束条件。1.2.2每次递归都要使问题的规模减小1.2.3递归的规模…

大家好,又见面了,我是你们的朋友全栈君。

1.递归算法
1.1递归的概念
所谓递归,就是程序方法在运行过程中自身调用自身。定义如下所示。

fn(){
	if(递归出口条件){
		return x;
}else{
	//some codes…
return fn();
}
}

1.2递归的使用条件
1.2.1 必须要有明确的递归出口
所谓递归出口就是需要有明确的结束条件。
1.2.2 每次递归都要使问题的规模减小
1.2.3 递归的规模不能太大
如果递归次数太多,很容易造成内存泄露。

1.3递归的优点及缺点
递归是一种算法策略。在二叉树、广义链表的节点遍历情景中,具有很重要的价值。事实上,递归与循环是解决遍历数据问题的两种不同的思路。对于循环而言,效率高是它的一大显著特点,不会占用额外的内存开销,但也有缺点,使用循环写的代码可读性不强,而且代码往往冗长;对于递归而言,效率方面较循环要逊色一些,因为递归需要开辟额外的内存空间,但优点是其代码简洁清爽,较为严谨,在解决某些特殊问题,又不得不使用递归来求解。一般地,递归问题都能转换为循环进行求解。

1.4递归举例
1.4.1 字符串反向输出
描述:输入字符串abc,要求能输出cba,以此类推。
分析:我们可以这样来考虑这个问题,cba=c+ba,这样,这个问题的规模就化解为了一个字母与ba这个字符串进行拼接,也就是f(3) = c+f(2)=cb+f(1),每递归一次,数组长度就减1,直到数组长度为0时,就是递归出口。代码如下所示。

package com.yzh.maven.main;
public class Digui {
	static int length = 0;
	public static void main(String[] args) {
		System.out.println(reverse("abcsdfg".toCharArray()));
	}
	
	public static String reverse(char[] c){
		length = c.length;
		String obj = "";
		//递归出口
	      if(length == 0){
			return obj;
		}else{
			//获取当前元素
			obj = c[--length]+"";
			//定义中间数组
			char[] c1 = new char[length];
//变为长度-1,问题规模减小
			System.arraycopy(c,0,c1,0,length);
			return obj+reverse(c1);
		}
	}
}

1.4.2 斐波纳契数列问题
描述:求1,1,2,3,5,8,13…数列的第n项。
分析:我们注意到,该数列从第三项开始,其数值等于前两项之和。这个表达式可以用fn(n) = fn(n-1)+fn(n-2) (n>2)来表示。当n=1或n=2时,可以直接获取结果,因此可以作为递归的出口;而fn(n-1) = fn(n-2)+fn(n-3),我们看到,该问题再向出口一步步靠近,也就是问题规模在不断减小,因此满足递归的条件。代码实现如下所示。

public static int fibonacci(int n){
	//递归出口
	if(n == 1 || n == 2){
		return 1;
	}else{
		return fibonacci(n - 1) + fibonacci(n - 2);
	}
}

1.4.3阶乘问题
描述:求n!。
分析:对于阶乘,我们同样可以使用递归求解。我们令fn(n)=!n,那么fn(n-1)=(n-1)!,从而fn(n)=nfn(n-1),当n=1时,那么fn(1)=10!=1,能够直接获得的结果可以作为递归出口,同时,我们看到阶乘的规模在一步步减小,直到直接获得作为递归出口的结果。代码如下所示。

public static int factorial(int n){
	//递归出口
if(n == 1){
		return 1;
	}else{
		return n*factorial(n-1);
	}
}

1.4.4单链表节点数据的遍历
在这里插入图片描述
分析:我们知道,单链表是链表中结构最简单的。一个单链表的节点(Node)分为两个部分,第一个部分(data)保存或者显示关于节点的信息(需要存储的数据),另一个部分存储下一个节点的地址,也就是指针域。最后一个节点存储地址的部分指向空值。我们可以利用这个空值来作为单链表节点数据的遍历的递归出口,代码如下所示。
节点模型:

package com.yzh.maven.main;

public class Node {
	private Object data;
	private Node nextNode;
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	public Node getNextNode() {
		return nextNode;
	}
	public void setNextNode(Node nextNode) {
		this.nextNode = nextNode;
	}
}

取出所有的节点数据:
public static void showAllNodeData(Node node){
	//递归出口
	if(null == node){
		return;
	}else{
		System.out.print(node.getData()+"->");
		showAllNodeData(node.getNextNode());
	}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156720.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IDOR漏洞接管Facebook页面,获1万6千美金奖励「建议收藏」

    IDOR漏洞接管Facebook页面,获1万6千美金奖励「建议收藏」印度小哥的自拍有点曝光过度了啊 Facebook能给出这么高的奖励,好棒啊发现Facebook零日漏洞,获得10万7千元人民币奖励安全研究人员发现Facebook存在零日漏洞!可以接管Facebook的任何页面。Facebook几乎是中小企业推广自家产品的最高效又低成本的平台。合理借用Facebook的关键在于装帧好某项产品或服务的Facebook页面,品牌、企业、组织和

    2022年6月11日
    34
  • 《前端运维》一、Linux基础–03Shell基础及补充「建议收藏」

    诶诶欸?不是学Linux么?怎么要讲shell了?shell是啥?啥是shell?别急,我们先简单了解下shell是什么。Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。

    2022年3月25日
    38
  • Java数组删除指定元素

    Java数组删除指定元素//删除数组中其中一个元素publicstaticvoidtestB(){String[]str={“Java”,”C++”,”Php”,”C#”,”Python”};//删除phpList<String>list=newArrayList<String>();for(inti=0;i<str.length;i++){list.add(str[i]

    2022年8月11日
    5
  • goland 2021.9 激活码【最新永久激活】

    (goland 2021.9 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年3月26日
    86
  • FM/FFM

    FM/FFMFM背景及相关算法对比(1)FM(factorizationmachine)是在LR(logisticregression)基础上,加入了特征的二阶组合项;(2)SVM和FM的主要区别在于,SVM的二元特征交叉参数是独立的,如wijw_{ij}wij​,而FM的二元特征交叉参数是两个k维的向量vi、vjv_i、v_jvi​、vj​,即&lt;vi,vj&gt;&lt…

    2022年5月2日
    50
  • webApp开发心得「建议收藏」

    webApp开发心得「建议收藏」从事单页相关的开发一年有余,期间无比的推崇webapp的网站模式,也整理了很多移动开发的知识点,但是现在回过头来看,webapp究竟是好还是不好真是一言难尽哟!webapp使用JavaScript修改页面;紧接着再从服务器传递更多数据然后再修改页面,如此循环。从性能的角度看,在现代浏览器中单页面WebApp已经能够和普通native应用程序相媲美,而且几乎所有的操作系统都支持现代的浏览器…

    2022年6月29日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号