zoukankan      html  css  js  c++  java
  • 常用算法思想复习之<递归与分治>

    1、概述

    在解决一些复杂问题,特别是解决一些规模较大的问题时,常常将问题进行分解。具体来说,

    就是将一个规模较大的问题分割成规模较小的同类问题,然后将这些小的问题逐个加以解决,

    最终也就将整个大的问题解决了。这种分而治之的思想称为分治的思想。

    所谓递归算法,就是一种直接或间接地调用原算法本身的一种算法。递归与分治的算法思想

    往往相伴而生。

    2、问题实例

    例:求正整数不同的划分个数。

    1)问题解释:将一个正整数n表示成一系列正整数之和:

         n=n1+n2+......+nk

    称为正整数n的一个划分。求正整数n的不同划分个数。

    2)问题分析

    根据正整数划分的定义,可以总结出一下规律:

    设标记P(n,m)表示正整数n的所有不同划分中,最大加数不大于m的划分个数。

    如:p(6,2)表示6的最大加数不大于2的所有划分

    p(n,1)=1, n>=1;

    正整数n的划分中加数不大于1的划分数只有一种

    p(n,m)=p(n,n), m>=n;

    不存在最大加数大于n的正整数n的划分

    p(n,n)=p(n,n-1)+1

    最大加数为n的正整数n的划分只有一种

    p(n,m)=p(n,m-1)+p(n-m,m),  n>m>1;

    p(n,m)=p(n,m-1)+n的最大加数为m的划分个数

    n的最大加数为m的划分个数记为:q(n,m)

    则q(n,m)=p(n-m,m),因为n-m的划分的个数决定了q(n,m)的

    划分个数,又q(n,m)中最大加数为m所以n-m的划分中最大加数

    也为m。故q(n,m)=p(n-m,m),即,p(n,m)=p(n,m-1)+p(n-m,m)

    根据以上规律可以写出递归程序:

    View Code
    1 int P(int  n, int m)
    2 {
    3 if(m==1 || n==1) return 1;
    4 if(m>n) return P(n,n);
    5 if(m==n) return P(n,m-1)+1;
    6 return P(n,m-1)+P(n-m,m);
    7
    8 }

     

  • 相关阅读:
    有个名字叫随便乱记——css3
    CSS3伸缩布局
    路政整理
    GIst
    SVN回滚版本
    你需要知道的CSS3 动画技术
    iScroll框架的使用和修改
    CSS3阴影 box-shadow的使用和技巧总结
    Javascript异步编程的4种方法
    zepto学习零碎
  • 原文地址:https://www.cnblogs.com/landy126/p/2376591.html
Copyright © 2011-2022 走看看