“递归”过程是指函数调用其本身的过程。但是函数每次在自身调用的同时会占用更多的内存空间,保存它局部变量的附加副本。如果这个进程无限持续,最终会栈溢出,导致StackOverflowError错误。
递归优点:简化程序设计,代码简单,可读性好。
缺点:逻辑复杂,空间消耗大,或者导致栈溢出。
package demo;
public class Demo1026_2 {
public static int age(int n){
int age = 18;
for(int i = 2;i <= n;i ++){
age = age + 2;
}
return age;
}
//递归
public static int age2(int n){
if(n == 1){
return 18;
}else{
return age2(n - 1) + 2;
}
}
/**
*求n的阶乘
*/
public static int fun(int a){
int fac = 1;
for(int i = a;i > 0;i --){
fac = fac * i;
}
return fac;
}
//递归
public static int fun2(int a){
int tmp = 1;
if(a == 1) {
return tmp;
}else {
tmp = fun2(a - 1) * a;
return tmp;
}
}
/**
*汉诺塔问题
*/
public static void move(char pos1,char pos2){
System.out.print(pos1 + "==>" + pos2 + " ");
}
public static void hanio(int n,char pos1,char pos2,char pos3){
if(n == 1){
move(pos1,pos3);
}else{
hanio(n - 1,pos1,pos3,pos2);//将n-1个盘子从A经过C挪到B
move(pos1,pos3);//最后一个从A到C
hanio(n - 1,pos2,pos1,pos3);//n-1从B经A到C
}
}
public static void main(String[] args) {
System.out.println(age(5));
System.out.println(age2(5));
System.out.println(fun(5));
System.out.println(fun2(5));
hanio(1,'A','B','C');
System.out.println();
hanio(2,'A','B','C');
System.out.println();
hanio(3,'A','B','C');
}
}
练习
斐波那契数列递归法
//斐波那契数列
//递归每次都要调用本身函数,循环是直接计算
/**
* 分段函数
* F(n)={
*0<n<=2 f(n)=1
* n>2 f(n) = f(n-1) + f(n-2)
*/
package practise.recurrence;
public class Fibonacc {
//递归:
// 数列的每一项
public static int fibonacc(int n){
if(n == 1 || n == 2){//第一项和第二项,返回1
return 1;
}else{
return fibonacc(n - 1) + fibonacc(n - 2);//第n项等于(n-1)+(n-2)
}
}
//for循环:
public static int fibonacc2(int n){
int f1 = 1;
int f2 = 1;
int f3 = 1;
for(int i = 3;i <= n;i ++){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
public static void main(String[] args) {
int n = 10;
for(int i = 1;i <= n;i ++){
System.out.print(fibonacc2(i) + " ");
// System.out.print(fibonacc(i) + " ");//打印第一项到第n项
}
}
}