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

本文介绍了递归算法的基本思想,并通过四个实例——求阶乘、斐波那契数列、汉诺塔问题和递推连分式开根号——详细展示了递归在编程中的应用。每个示例都包含具体的Java代码实现,帮助读者理解递归如何解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🍓系列专栏:蓝桥杯

🍉个人主页:个人主页

目录

🍉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.递推连分式开根号🥝

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱编程的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值