javascript - JS 最小到目前为止回溯算法错误
问题描述
我正在尝试在 JS 中实现回溯算法,以通过交换 k 位找到可能的最小值。
我不明白为什么我的代码不起作用。如果我注销 的值num
,它会下降到159
但由于某种原因不会作为 minSoFar 返回。
请问有什么想法吗?
function swap( arr, i, j ) {
const temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function findMin( digits, n, k, minSoFar ) {
// Compare current number with minimum number so far
const num = parseInt( digits.join( '' ) );
if ( num < minSoFar ) {
minSoFar = num;
}
// base case - no more swaps allowed.
if ( k < 1 ) {
return minSoFar;
}
// For each digit in the input string
for ( let i = 0; i < n - 1; i++ ) {
// compare the current digit with remaining digits
for ( let j = i + 1; j < n; j++ ) {
// if digit at i'th index is more than the digit at j'th index
if ( digits[i] > digits[j] ) {
// swap digits i and j
swap( digits, i, j );
// recur for remaining k - 1 swaps
findMin( digits, n, k - 1, minSoFar );
// backtrack - restore the string back
swap( digits, i, j );
}
}
}
return minSoFar;
}
let i = 951;
let k = 2;
let digits = Array.from( String( i ), Number );
let minimum = findMin( digits, digits.length, k, i );
console.log( `The minimum number formed by doing at most ${k} swaps is ${minimum}` );
解决方案
它无法正确返回,因为分配的 minSoFar 是它所在的递归框架的本地。要么(1)使 minSoFar 对递归全局,要么(2)使其成为对象中的值并传递对象(因为那些被传递通过引用,递归帧将修改相同的值),或者(3)实际比较返回的 min 而不是尝试分配它。
(3) 表示分配findMin( digits, n, k - 1, minSoFar )
给本地值,从循环中返回最佳值。
推荐阅读
- database - 两个数据库之间的提交机制中的协同排序缺失
- arrays - 使用 $set 更新函数更新嵌套文档会导致“位置运算符未找到查询所需的匹配项”。
- python - 当 github 没有加载我的 jupyter notebook 图形/绘图时该怎么办?
- javascript - 根据用户选择更新 React Native 语言
- python-3.x - 如何在 python 3 中导入?
- rapidminer - 如何在 RapidMiner 中过滤属性中的字符串值
- javascript - 当我的两个状态都被调用时出现问题(TypeError:无法读取未定义的属性'map')
- javascript - 将选择显示为主框的最有效方式
- powershell - 如何在powershell中测试按键或继续
- r - 在 R 中复制 ewm pandas 函数