【蓝桥杯-筑基篇】递归-递推

系列专栏:蓝桥杯

个人主页:个人主页

目录

1.求阶乘

2.斐波那契数列

3.汉诺塔

4.递推连分式开根号


 

递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。

书写递归时我们要考虑好以下三步:

这个函数从哪里开始?
这个函数从哪里结束?
这个函数每一步需要干什么?
 

1.求阶乘

例如:利用递归来求1到5的阶乘。5! = 5 * 4! ,4! = 4 * 3!,3! = 3 * 2!, 2! = 2 * 1!,1!=1;

所以可总结出当n>1时可用n!=n * (n-1)!来计算,当n=1或n=0时n!为1,因此可以得出以下代码。

public class A {
    public static void main(String[] args) {
 
    	for (int j = 1; j <= 5; j++) {
    		System.out.println(factorial(j));
		}
    	 
 	

    }

	private static int factorial(int i) {
		// TODO Auto-generated method stub
		if(i==1) {
			return 1;
		}
		else return i*factorial(i-1);
		
	}

}

这个方法会一直调用自己,直到  i  等于 1,然后返回 1。如果 i 不等于 1,就返回  i  乘以 factorial(  i - 1) 的结果。

2.斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,

指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
 

public class Fibonacci {
public static int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
}

在这个代码中,我们使用递归的方式来实现斐波那契数列。如果 n 小于等于 1,我们直接返回 n。否则,我们递归地计算 fibonacci(n-1) 和 fibonacci(n-2),并将它们相加返回。

3.汉诺塔

汉诺塔(Tower of Hanoi),又称河内塔。源自印度古老传说的一个游戏,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
 

推荐视频:递归,汉诺塔,最全面的讲解,没有之一_哔哩哔哩_bilibili

public class A {
    public static void main(String[] args) {
        int n = 3; // 汉诺塔的层数
        hanoi(n, 'A', 'B', 'C');
    }

    public static void hanoi(int n, char from, char temp, char to) {
        if (n == 1) {
            System.out.println("Move disk 1 from " + from + " to " + to);
        } else {
            hanoi(n - 1, from, to, temp);
            System.out.println("Move disk " + n + " from " + from + " to " + to);
            hanoi(n - 1, temp, from, to);
        }
    }
}

4.递推连分式开根号

【蓝桥杯-筑基篇】递归-递推_第1张图片

 

public class SqrtDitui {

	public static void main(String[] args) {
		System.out.println(Math.sqrt(2));
		double ans=0;
		for(int i=1;i<=100;i++) ans=1.0/(2+ans);//x=1/(2+x)
		System.out.println(ans+1);
	}
}
1.4142135623730951
1.4142135623730951

你可能感兴趣的:(蓝桥杯,蓝桥杯,算法,职场和发展)