java递归函数(java递归函数返回值求助)
老铁们,大家好,相信还有很多朋友对于java递归函数和java递归函数返回值求助的相关问题不太懂,没关系,今天就由我来为大家分享分享java递归函数以及java递归函数返回值求助的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
帮忙讲下java中递归和对象的引用的方法
函数的重载就是指通过同一个方法名,传入不同的参数,达到不同的目的,函数的重载是面向对象语言的基本特征,重载的方法完成的功能都是基本相同的。
重载的实质是不同的方法!!
函数的重载只需要也必须满足参数列表不同,如参数类型、个数、顺序!
比如
public int m(int i,String s)都可以说是重载。注意:只有返回类型是不能区别重载方法的!
递归指的是,一个函数不断引用自身,直到引用的唯一已知对象时止的过程。
使用递归解决问题,思路清晰,代码少。
归函数可能用尽所有可用的资源(如系统内存、堆栈空间等等)。每次递归函数调用自身(或调用另一个函数,而另一个函数又调用原来的函数),递归函数就会占用一些资源。当递归函数退出时,就会释放这些资源,但是函数的递归层次过多,就会用尽所有可用的资源。发生这种情况时,就会引发异常。
因此,谨慎设计递归函数是非常重要的。如果怀疑可能出现递归过多(或无限递归)的情况,则设计函数时就应加入计算函数调用其自身的次数的功能,并设置调用次数限制。如果函数调用自身的次数超过阈值,则函数可以自动退出。迭代的最大次数的最佳取值取决于递归函数。
java中递归算法是什么怎么算的
一、递归算法基本思路:
Java递归算法是基于Java语言实现的递归算法。递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法表示问题的解。递归往往能给我们带来非常简洁非常直观的代码形式,从而使我们的编码大大简化,然而递归的思维确实跟我们的常规思维相逆的,通常都是从上而下的思维问题,而递归趋势从下往上的进行思维。
二、递归算法解决问题的特点:
【1】递归就是方法里调用自身。
【2】在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
【3】递归算法代码显得很简洁,但递归算法解题的运行效率较低。所以不提倡用递归设计程序。
【4】在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
【5】在做递归算法的时候,一定把握出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口就是一个条件,当满足了这个条件的时候我们就不再递归了。
三、代码示例:
publicclassFactorial{
//thisisarecursivefunction
intfact(intn){
if(n==1)return1;
returnfact(n-1)*n;
}
}
publicclassTestFactorial{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Factorialfactorial=newFactorial();
System.out.println("factorial(5)="+factorial.fact(5));
}
}
代码执行流程图如下:
此程序中n=5就是程序的出口。
java递归函数返回值求助
是的,这段代码中的递归调用只会返回第一次的返回值。如果你想得到800*的结果,可以修改代码,使得第二次递归调用的结果被正确地返回。具体地,你可以在第二次递归调用结束之后,将结果返回到上一层递归调用,并在第一次递归调用结束之后将结果返回。修改后的代码如下:
String deal(String s1, String s2){ if(s1!= null){ if(contact(s1.charAt(s1.length()- 1))== 1){
s1+= s2; return s1;
} else{
s1= s1.substring(0, s1.length()- 1);
s1= deal(s1, s2);//递归调用并将返回值赋值给s1
return s1;//将结果返回到上一层递归调用
}
} return s1;
}
int contact(char ch){ if(Character.isDigit(ch)|| ch=='*'|| ch=='.'|| ch=='-') return 1; if(ch=='+'|| ch=='/') return 2; return 0;
}String str= deal("800-","*");//返回的结果为800*
java递归方法
一般递归只实现一个方向的逻辑,把两个方向的逻辑放到一方法里并不好,不容易控制,实现也很麻烦,考虑到维护时的难度请不要在实际项目中使用。
搞了好一会,搞出个这样的输出2N-1行星号,中间最长的一行不重复,如果楼主希望重复中间一行,可以对代码做一点点改动。
/**
*入口,传入N
*/
public static void printStar(int number){
printStar2(number, number, 1);
}
/**
*
*@param number给定的N
*@param oldNumber给定的N
*@param direction递归时的方向
*/
public static void printStar2(int number,int oldNumber, int direction){
if(number==0)direction++;
String s="";
int i= number;
if(direction==1){
for(;i<oldNumber;i++){
s+="*";
}
number--;
}else{
for(;i<oldNumber;i++){
s+="*";
}
number++;
if(number>oldNumber){
return;
}
}
printStar2(number,oldNumber,direction);
System.out.println(s);
}
-----------------------------------------------------------------------------------------
运行效果:
printStar(5);
*
**
***
****
*****
****
***
**
*
OK,本文到此结束,希望对大家有所帮助。