快捷搜索:

拆分自然数:纯while实现(Part 2 - 实现)

在拆分自然数:纯while实现 (Part 1 - 思路) 这篇文章里面,我供给懂得答Jeff《编程小演习:拆分自然数》问题的一种解答思路,并且应用了两个例子来解释这种思路,不知道你是否已经成功使用这种思路解题了呢?

首先,这道题的搜索域是什么?那便是[min, min, min, ..., min]到[max, max, max, ..., max],或者是它的子集。就算你完全不懂算法,我信托你凭直觉也知道要在[min, min, min, ..., min]到[max, max, max, ..., max]之间搜索。是以,一个算法好不好,就看你能否有效缩小搜索域了。

在不缩小搜索域的环境下,你可以排列组合出搜索域内的所有可能性,一一验证是否为所求解,这也便是Jeff的DoSimple示例所做的。接着,为了维持解的不重复性,你可能想到了有效解必然是一个不下降序列,是以对所有非不下降序列进行剪枝,这也便是Jeff的DoBetter示例所做的工作。然后,你必要把不下降序列中总和不即是 sum的环境给砍掉落,这个剪枝便是最难的一个剪枝了,也便是DoBest所做的工作。

Jeff 在DoBest中的做法是,对付当前操作的第i位,求得itemMinInclusive与itemMaxInclusive,且 minInclusive function main(m, n, min, max) {

var array = new Array(n);

var i = 0;

var write = function() {

console.log(m + ' = ' + array.join(' + '));

};

var scan = function() {

if (scan.start) {

scan.start = false;

scan.sum = 0;

}

scan.sum += array[i];

return (array[i] > array[n - 1] - 2);

};

var step = function() {

array[i]++;

fill.sum = scan.sum - array[i];

i++;

};

var fill = function() {

while (i =0 && scan()) {

i--;

}

if (i

您可能还会对下面的文章感兴趣: