数据结构之递归与分治的思想

递归与分治的思想:

解决一些规模较大的问题时,常常将问题进行分解,将一个规模较大的问题分割成为规模较小的同类问题,然后将小的问题逐个的加以解决,最终整个问题就迎刃而解。最为经典的分治思想就是“折半查找算法”,采用分治的策略不断地缩小问题的规模。

递归的思想:就是直接或者间接的调用原算法本身的一种算法。

递归算法的注意点:

  1. 每个递归函数都必须有一个非递归定义的初始值,作为递归的结束标志,或者递归结束的出口。
  2. 在设计递归算法的时候,要解决的问题要具有递归性。
  3. 递归算法的运行较低,时间和空间的复杂度都比较高,对于时间复杂度和空间复杂度要求较高的程序,采用非递归算法设计。

将一个正整数n表示成一系列的正整数之和 :
n=n1+n2+n3+n4+n5+…+nk
假设p(n,m)表示正整数n的所有划分中,最大的加数不大于m的划分个数。
可以建立如下的递归关系:

  1. p(n,1)=1,n>=1;
  2. p(n,m)=p(n,n), m>=n
  3. p(n,n)=p(n,n-1)+1;
  4. p(n,m)=p(n,m-1)+p(n-m,m), n>m>1
    比如说:
    6=6
    6=5+1
    6=4+2 6=4+1+1
    6=3+3 6=3+1+1+1 6=3+2+1
    6=2+2+2 6=2+1+1+2 6=2+1+1+1+1
    6=1+1+1+1+1+1

p(6,4)即6的最大加数不大于4的划分数等于p(6,3)加上6的最大加数为4的划分数

注意这里是6的最大加数为4而不是不大于4,那么它就等于6-4=2的最大加数不大于4的划分数 p(6-4,4)=p(2,4)=2
根据以上的递归关系,可以计算p(n,m)的递归函数式

#include "stdio.h"
int p(int n,int m)
{
if(n==1||m==1) return 1;
if(m>n)return p(n,n);
if(m==n) return 1+p(n,m-1);
return p(n,m-1)+p(n-m,m);

}

int main(){
int n,s;
printf("请输入整数:\n");
scanf("%d",&n);
s=p(n,n);
printf("%d的划分数目为:%d\n",n,s);
return 0;
}

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/magic_faker/article/details/79336893
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞