您的位置:首页 > 理论基础 > 数据结构算法

数据结构 No.6 java递归的简单应用

2018-02-05 11:03 381 查看

定义


语言例子

从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”

一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:“一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:‘一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到……’”


正式定义

数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。

例如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。
某人祖先的双亲同样是某人的祖先(递归步骤)。

代码示例

下面的代码一共两个方法,展现了递归最基础的应用,第一个test方法,调用此方法执行打印操作,然后在调用此方法。第二个test2方法,输入目标值,然后打印此值,然后将比目标数小一个的数字传入方法中,调用,在打印,在调用,在打印。
public class Recursion {

public static void main(String[] args) {
test2(100);
}

/**
* 演示方法   死循环,抛异常
*/
public static void test() {
System.out.println("Hello,World!");
test();
}

/**
* 打印从1到目标数字
*/
public static void test2(int n) {
if(n == 0) {
return;
}
System.out.println(n);
test2(n - 1);
}
}
这个演示的为一个基本的三角数列,就是A,B,A+B,B+A+B....
/**
* 三角数列
* @project JavaData
* @date 2018年2月5日 上午10:43:06
* @author Huaxu-Charles
*/
public class Triangle {

public static int getNumber(int n) {
int total= 0;
while(n > 0) {
total = total + n;
n--;
}
return total;
}

public static int getNumberByRecursion(int n) {
if(n == 1) {
return 1;
} else {
return n + getNumberByRecursion(n - 1);
}
}
}


斐波那契数列是典型的递归案例:
{\displaystyle F_{0}=0}

(初始值)
{\displaystyle F_{1}=1}

(初始值)
对所有大于1的整数n:{\displaystyle F_{n}=F_{n-1}+F_{n-2}}

(递归定义)

/**
* 斐波那契数列
* @project JavaData
* @date 2018年2月5日 上午10:59:56
* @author Huaxu-Charles
*/
public class Fibonacci {

public static int getNumber(int n) {
if(n == 1) {
return 0;

} else if(n == 2){
return 1;

} else {
return getNumber(n - 1) + getNumber(n - 2);
}
}
}

小结:个人感觉递归的东西用语言描述起来反而比较抽象和繁琐,可能自己本身了解的还不够深,语言功底不够,所以话少,代码比较多。还有就是在编写递归调用的函数的时候,一定要把对简单情境的判断写在最前面,以保证函数调用在检查到简单情境的时候能够及时地中止递归,否则,你的函数可能会永不停息的在那里递归调用了。下一期会演示经典递归汉诺塔问题的分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: