首先介绍一下思路
n表示被划分的数
m表示划分中的最大值
// 根据n和m的关系,考虑以下几种情况:
// (1)当 n = 1 时,不论m的值为多少(m > 0 ),只有一种划分即 { 1 };
// (2) 当 m = 1 时,不论n的值为多少,只有一种划分即 n 个 1,{ 1, 1, 1, ..., 1 };
// (3) 当 n = m 时,根据划分中是否包含 n,可以分为两种情况:
// (a). 划分中包含n的情况,只有一个即 { n };
// (b). 划分中不包含n的情况,这时划分中最大的数字也一定比 n 小,即 n 的所有 ( n - 1 ) 划分。
// 因此 f(n, n) = 1 + f(n, n-1);
// (4) 当 n < m 时,由于划分中不可能出现负数,因此就相当于 f(n, n);
// (5) 但 n > m 时,根据划分中是否包含最大值 m,可以分为两种情况:
// (a). 划分中包含 m 的情况,即 { m, { x1, x2, ..., xi } }, 其中 { x1, x2, ..., xi } 的和为 n - m,可能再次出现 m,因此是(n - m)的 m 划分,因此这种划分
// 个数为 f(n-m, m);
// (b). 划分中不包含 m 的情况,则划分中所有值都比 m 小,即 n 的 ( m - 1 ) 划分,个数为 f(n, m - 1);
// 因此 f(n, m) = f(n - m, m) + f(n, m - 1);
//下边是代码以及注释
//代码原型为借鉴,原作者地址我没再找到。就不贴网址了
//原作者的做法写的递归函数不到十行,远比其他我搜到的方法简单,就是没有注释,让我这个菜鸟难以理解。
//这两天潜心钻研,略有领悟。所以写下来供大家分享 如有不周之处 请指出 我会加以改正
n表示被划分的数
m表示划分中的最大值
// 根据n和m的关系,考虑以下几种情况:
// (1)当 n = 1 时,不论m的值为多少(m > 0 ),只有一种划分即 { 1 };
// (2) 当 m = 1 时,不论n的值为多少,只有一种划分即 n 个 1,{ 1, 1, 1, ..., 1 };
// (3) 当 n = m 时,根据划分中是否包含 n,可以分为两种情况:
// (a). 划分中包含n的情况,只有一个即 { n };
// (b). 划分中不包含n的情况,这时划分中最大的数字也一定比 n 小,即 n 的所有 ( n - 1 ) 划分。
// 因此 f(n, n) = 1 + f(n, n-1);
// (4) 当 n < m 时,由于划分中不可能出现负数,因此就相当于 f(n, n);
// (5) 但 n > m 时,根据划分中是否包含最大值 m,可以分为两种情况:
// (a). 划分中包含 m 的情况,即 { m, { x1, x2, ..., xi } }, 其中 { x1, x2, ..., xi } 的和为 n - m,可能再次出现 m,因此是(n - m)的 m 划分,因此这种划分
// 个数为 f(n-m, m);
// (b). 划分中不包含 m 的情况,则划分中所有值都比 m 小,即 n 的 ( m - 1 ) 划分,个数为 f(n, m - 1);
// 因此 f(n, m) = f(n - m, m) + f(n, m - 1);
//下边是代码以及注释
//代码原型为借鉴,原作者地址我没再找到。就不贴网址了
//原作者的做法写的递归函数不到十行,远比其他我搜到的方法简单,就是没有注释,让我这个菜鸟难以理解。
//这两天潜心钻研,略有领悟。所以写下来供大家分享 如有不周之处 请指出 我会加以改正