递归算法
1
递归算法
什么是递归 递归调用的实现原理 递归经典例题
递归定义
在定义一个过程或函数时出现调用本过 程或本函数的成分,称之为递归。 若调用自身,称之为直接递归。 若过程或函数p调用过程或函数q,而q又调 用p,称之为间接递归。
何时用到递归 以下三种情况常常用到递归方法。
1 定义是递归的 2 数据结构是递归的 3 问题的解法是递归的
int main() { int a[1000]; f(6,a,0); return 0; }
经典问题:整数划分
要求:如果对上一个题改一下要求,求解一共多少种划分方 法,如果不用上一种思路,请再尝试另一种递归解决方案
经典问题:整数划分
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在 讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成 如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n) ,则{m1,m2,...,mi}为n的一个划分。 如果{m1,m2,...,mi}中的最大值不超过m,即 max(m1,m2,...,mi)<=m,则称它属于n的一个m划分。这里我们记 n的m划分的个数为f(n,m); 例如但n=4时,他有5个划分, {4},{3,1},{2,2},{2,1,1},{1,1,1,1}; 注意4=1+3 和 4=3+1被认为是同一个划分。 该问题是求出n的所有划分个数,即f(n, n)。下面我们考虑求f(n,m) 的方法; 1.递归法:
15
f (int a[], int begin, int n) if (begin==n) return 0; else return a[begin]+f(a,begin+1,n);