递归与分治法经典例子

本文介绍了递归与分治法的基本概念,并通过实例详细讲解了包括汉诺塔、全排列问题、整数划分、二分搜索、大数乘法等在内的多个经典算法案例,帮助读者理解这两种算法的应用和思想。

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


关于算法

问题1:算法基本概念/算法和程序:定义和区别是什么?
概念/定义和区别:

  • 算法:指解决问题的方法或过程。
  • 程序:是算法用某种程序设计语言的具体实现。
  • 程序可以不满足算法性质的有限性。

问题2:算法的复杂性统计/复杂性分析和估算:简单分析与估算。

  • 算法复杂性的高低体现在运行该算法所需要的计算机资源的多少,所以有时间复杂性和空间复杂性之分。
  • 为简化算法复杂性的分析,引入渐进符号:O(上界)、Ω(下界)、Θ(同阶)、o、ω

递归与分治法基本概念

  • 递归:直接或间接地调用自身的算法称为递归算法。
  • 分治:大问题分解为小问题,对这k个子问题分别求解。将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。

递归经典例子

hanoi塔

有三根针a、b、c。a 针上有N个盘子,大的在下,小的在上,要求把这N个盘子从 a 针移到 b 针,在移动过程中可以借助 c 针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
解决思路:

  1. 当 n=1 时,直接将圆盘从 a 移到 b。
  2. 当 n>1 时,需要利用 b,将 n-1 个圆盘移到 c 上,然后将剩下的最大圆盘移到 b
  3. 最后利用 a,将 n-1 个较小的圆盘从 c 移到 b 上(递归子问题 n-1)。

我们将n个圆盘的移动问题就分解成了两次 n-1 个圆盘的移动问题。

递归算法:

		public static void hanoi(int n,int a,int b,int c){
   
   
			if(n==1){
   
   
				move(a,b);
			}else{
   
   
				hanoi(n-1,a,c,b);
				move(a,b);
				hanoi(n-1,c,b,a);
			}
		}

分治法经典例子

整数排列(全排列问题)

解决思路:
依次将待排列的数组的后n-1个元素与第一个元素交换,则每次递归处理的都是后n-1个元素的全排列。当数组元素仅有一个时为此递归算法的出口。

伪代码:

		public void Perm(int[] a,int k,int n){
   
   
			if(k==m){
   
   
				for(int i=0;i<n;i++){
   
   
					System.out.println(a[i]);
				}
			}else{
   
   
				for(int i=k;i<n;i++){
   
   
					swap(a,i,k);
					perm(a,k+1,m);
					swap(a,i,k);
				}
			}
		}

整数划分

问题:将给定正整数n表示成一系列正整数之和
n=n1+n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值