递归与分治

本文详细介绍了递归与分治策略,包括递归的基本概念、递归规则、分治法的步骤和实例,如 Ackerman 函数、汉诺塔问题、二分搜索、大整数乘法、矩阵乘法优化、最接近点对问题、合并排序、快速排序以及线性时间选择等。通过递归边界和子问题的独立性,阐述了如何有效地解决复杂问题。
摘要由CSDN通过智能技术生成

一、递归与分治概述:

1、分治方法在于分和治。将一定规模的问题划分成性质相同的若干个小问题,分;对于每个小问题,进行所需要进行的操作,如排序等。

2、关于递归:

(1)递归中需要的成分是递归边界和递归规则,没有递归边界递归无法停止、无法进行。

(2)通过将各层的关系从小到大逐渐带入,可以求解出一个函数的非递归表达式。

(3)n该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

3、Ackerman函数:

Ackerman函数的定义为:

根据关系可以递推出来:

在m取不同的值的过程中,该函数的递推关系式也不同。只是一种无法用单一的非递归关系表达的函数。

4、在Ackerman函数中,定义它的逆拟函数α(n)为使A(x)>n成立的最小的x。

5、整数划分问题:

对于整数的不同划分,考虑以下几种不同的情况:(1)m>n:q(n,m)=q(n,n)

(2)m=n:q(n,m)=1+q(n,m-1)

(3)m<n:q(n,m)=w(n,m)+q(n,m-1)

又:w(n,m)=q(n-m,m)

(4)m=1:q(n,1)=1

6、汉诺塔问题:

思路:将前n-1个元素移动到c上,然后将第n个移动到b上,再将c上的n-1个移动到b上。

注意边界条件是:如果只有一个元素,直接move到b上。

void Move(int no,char a,char b){
    printf("Move %d from %c to %c.\n",no,a,b);
}
void Hanoi(int n,char a,char b,char c){
    if(n==1){
        Move(1,a,b);
    }
    else{
    Hanoi(n-1,a,c,b);
    Move(n,a,b);
    Hanoi(n-1,c,b,a);
    }

}

7、分治法的基本思想:将一个叫难解决的大问题分成k个规模较小的子问题,逐个解决,分而治之。如果问题的规模还不够小,就继续划分,直到可以直接解决这个小问题。将求出的小问题自下而上的合并,最终得到问题的解

8、递归的概念:

递归算法:直接或间接地调用自身的算法。

递归函数:用函数自身给出定义的函数。

使用递归技术使得算法的描述简捷且易于理解

10、分治法满足的要求:

(1)问题的规模缩小到一定的程度就可以解决

(2&

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值