function count(m, n){ if (n < m) return; var mod = Math.floor( n / m) var rem = n % m var number = 1 var paths = [] paths.push([mod, rem, number]) mod += 1 rem -= m paths.push([mod, rem, number]) if (rem == -1) return paths add(paths) var closes = findClose(paths) while(closes.distance !== -1) { add(paths, closes.route) closes = findClose(paths) } add(paths, closes.route) return paths } function add(paths, route){ route = route || [0, 0] var exp1 = paths[route[0]] var exp2 = paths[route[1]] var mod = exp1[0] + exp2[0] var rem = exp1[1] + exp2[1] var number = exp1[2] + exp2[2] paths.push([mod, rem, number]) } function findClose(paths){ var minPositive = 0 var maxNegative = 0 var ret = [0, 0] paths.forEach(function(num, i){ var rem = num[1] if (rem > 0) { // 如果最小正数为0,那么初始化minPositive if (minPositive === 0) { minPositive = rem ret[0] = i } // 寻找更小的 if (minPositive > rem) { minPositive = rem ret[0] = i } } if (rem < 0) { // 如果最小正数为0,那么初始化minPositive if (maxNegative === 0) { maxNegative = rem ret[1] = i } // 寻找更小的 if (maxNegative < rem) { maxNegative = rem ret[1] = i } } }) return { route: ret, distance: minPositive + maxNegative } } console.log(count(3, 10000))