2.递归与分治

递归的概念
直接或间接的调用自身的算法称为递归算法

  • 单递归算法:如Fibinacci数列

当一个函数以及它的一个变量是由函数自身定义时,称这个函数是双递归函数。【(ー`´ー)听不懂,看下面分析】

  • 双递归算法:如Ackerman函数
    Ackerman函数A(n,m)定义如下:
    A(1,0)=2;
    A(0,m)=1 (m>=0)
    A(n,0)=n+2 (n>=2)
    A(n,m)=A(A(n-1,m),m-1) (n,m>=1)

分析:A(n,m)的自变量m的每一个取值都定义了一个单变量函数。
m=0时是+2
m=1时,A(1,1)=A(A(0,1),1)=A(1,0)=2,A(n,1)=A(A(n-1),1)=A(n-1,1)+2 (n>1),因此A(n,1)=2n(n≥1)

m=2时,
A(n,2)=A(A(n-1,2),1)=2A(n-1,2)和A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)=2^n
类似可以推出A(n,3)=2^ (2^(…)),2的层数为n
A(n,4)增长速度非常快,以至于没有式子表达
单变量的Ackerman函数A(n)定义为:A(n)=A(n,n),其拟逆函数α(n)=min{k|A(k)≥n},可以用来分析算法复杂性
那么:
当A(0)=1、A(1)=2、A(2)=4、A(3)=16
α(1)=0,α(2)=1,α(3)=α(4)=2,α(5)=…=α(16)=3
,可以看出α(n)增长速度极慢。
A(4)=2^ (2^(…))【(ーuー)你怎么知道】,其中2的层数为65536,这个数非常大,无法用通常的方式表达它,如果要写出这个位就需要log(A(4))位。所以,对于通常所见的正整数,有α(n)≤4

举例:

  • 排列问题:
    设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中元素的全排列记为perm(X)。{ri}perm(X)表示在全排列perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳定义如下:
    当n=1时,perm( R )=( r ),其中r是集合R的唯一元素.
    当n>1时,perm(X)=n!由(r1)perm(R1)=(n-1)!,(r2)perm(R2)=(n-1)!,…(rn)perm(Rn)=(n-1)!构成(n个(n-1)!)。

  • 整数划分问题:将正整数n划分成一系列正整数之和,n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的不同划分个数称为正整数n的划分数,记p(n)
    在划分数中,将最大加数n1不大于m(某个数)的划分个数。记q(n,m)。
    【(ーuー)为什么要引入这个m呢,是因为我们发现,从这个角度思考,比较容易求解个鬼

    建立q(n,m)的递归关系:
    (1)q(n,1)=1,n≥1(最大加数不大于1只有一种划分)
    (2)q(n,m)=q(n,n),m>n(最大加数n1实际上不能大于n,q(1,m)=1)
    (3)q(n,n)=1+q(n,n-1),m=n
    正整数n的划分由n1=n的划分和n1≤n-1的划分组成。此时就是对n的划分出来的数没有限制,默认限制就是不大于n。
    (4)q(n,m)=q(n,m-1)+q(n-m,m)n>m>1
    正整数n的最大加数n1不大于m的划分由n1=m和n1≤m-1的划分组成。可以看做是对n的划分有了条件,就是所有的划分出来的数小于m(某个数)。


    【0u0借你一看
    https://blog.csdn.net/qq_41333482/article/details/82823742】

【(QuQ)未完待续】
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值