1、方法定义
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式为:
语法解释:
- 形式参数:在方法被调用时用于接收外界输入的数据。
- 实参:调用方法时实际传给方法的数据。
- 返回值:方法在执行完毕后返回给调用它的环境的数据。
- 返回值类型:事先约定的返回值的数据类型,无返回值,必须给出返回类型viod。
- Java语言中使用下述形式调用方法:对象名.方法名(实参列表)
- 实参的数目、数据类型和次序必须和所调用方法声明的形式列表匹配。
- return语句中止方法的运行并指定要返回的数据。
Java中进行函数调用中传递参数时,遵循传递的原则:
基本类型传递的是该数据本身,引用类型传递的是对象的引用,不是对象本身
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。最好就是一个方法完成一个功能,这样利于我们后期的扩展。
2、递归结构
递归(recursion)是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想是:“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
递归结构包括两个部分:
- 定义递归头 解答:什么时候不调用自身方法,否则会陷入死循环
- 递归体 解答:什么时候需要调用自身方法
==========================
//程序:实现阶乘<span style="font-family: verdana, arial, helvetica, sans-serif;">factorial</span>
<span style="white-space:pre"> </span>public static long factorial(int n){
if(n==1){
return 1;
}else{
return n*factorial(n-1);
}
}
public static void main(String[] args) {
test01();
System.out.println(factorial(10));
}
==========================
递归算法
递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。
递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。
递归算法解决问题的特点:
1)递归就是方法里调用自身。
2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。否则会抛出StackOverflowError异常。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出(StackOverflowError异常)等,所以一般不提倡用递归算法设计程序。
递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
如何设计递归算法:
1)、确定递归公式
2)、确定边界(终了)条件
为了理解递归算法,现举一个实例说明如下:
问题描述:求解Fibonacci数列的第10个位置的值?(斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*))
===========================================
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 方法描述:求解Fibonacci数列的递归算法
<span style="white-space:pre"> </span> * 输入参数: int input
<span style="white-space:pre"> </span> * 返回:Fibonacci数列第input个数
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private static int fibonacci(int input){
<span style="white-space:pre"> </span>if(input==1 || input ==2){
<span style="white-space:pre"> </span>return 1;
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>return fibonacci(input-1)+fibonacci(input-2);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>System.out.println(fibonacci(5)); //返回Fibonacci数列第5个数
<span style="white-space:pre"> </span>}
显示结果:5
===========================================
总结:
1)递归算法,简而言之,就是方法直接或间接地调用自身。
2)递归算法必须有一个明确的递归结束条件,即递归出口。
3)递归算法简洁明了,但是效率不高。
本文参考: http://blog.csdn.net/wangloveall/article/details/7932704