【发布时间】:2021-06-05 11:53:18
【问题描述】:
我正在研究一个动态编程问题并且能够编写一个 Javascript 解决方案:
function howSum(targetSum,numbers,memo = {}){
//if the targetSum key already in hashmap,return its value
if(targetSum in memo) return memo[targetSum];
if(targetSum == 0) return [];
if(targetSum < 0) return null;
for(let num of numbers){
let aWay = howSum(targetSum-num,numbers,memo);
if(aWay !== null){
memo[targetSum] = [...aWay,num];
return memo[targetSum];
}
}
//no way to generate the targetSum using any elements of input array
memo[targetSum] = null;
return null;
}
现在我正在考虑如何将其转换为 CPP 代码。
对于memo 对象,我必须使用对unordered map 的引用。
但是我应该如何在基本条件中返回 empty array 和 null 值?我应该在插入元素时返回 array pointer 和 realloc 吗?那不是 C 方式编程呢?
另外我应该如何在 C++ 中将default parameter 传递给memo 无序映射?目前我已经重载了创建备忘录无序映射并传递其reference 的函数。
任何指导将不胜感激,因为我可以解决未来的问题。
【问题讨论】:
-
C++17 及更高版本通常具有用于此类情况的
std::optional和std::variant模板。但是 C++ 不是 Javascript。看看这个整体逻辑:在 C++ 中 this 返回null的情况可能会通过抛出异常来指示致命错误来处理。就此而言,您无法真正将 Javascript 翻译成 C++,或将任何语言翻译成任何其他语言,一次只尝试一行。这总是以泪水告终。正确的做法是分析现有代码的作用,并在新语言中重新实现其整体逻辑。 -
好的,谢谢你的洞察力。那么我应该去改变代码的逻辑吗?比如返回空数组和null?
-
我相信我很清楚地表明这不是正确的方法。正确的方法是从逻辑上分析所示代码的作用,然后在 C++ 中实现与它在功能上逻辑等效的东西。在 C++ 中,
NULL常量只对指针类型有效,C++ 函数不能返回数组。 C++ 不能以这种方式工作。因此,您将需要为您的 C++ 代码找到这些概念的其他替代品,这是您需要自己做出的决定,因为只有您知道如何使用替代代码。 -
你可以返回一个布尔值来表示成功,例如godbolt.org/z/6s6sb9e5r
标签: javascript c++ dynamic-programming