如何将实现目标和查找的JavaScript howSum代码改写为C++版本
解决方案
针对你遇到的两个核心问题,我们分别处理:
- 返回值无法为null的问题:C++ 17起提供了
std::optional类型,可以表示「有值」或「无值」两种状态,完美匹配你JS代码里返回数组/返回null的逻辑。如果需要兼容更早的C++标准,可以改用「函数返回bool表示是否找到解,同时用引用参数传递结果数组」的方案。 - vector参数传递问题:你的逻辑中不需要修改输入的numbers数组,所以用
const vector<int>&传递即可,既避免了值传递的拷贝开销,也保证了原数组不会被误改。
完整C++17实现(最贴合原JS逻辑)
#include <vector> #include <optional> #include <iostream> using namespace std; // 新手使用可省略std::前缀,降低上手成本 optional<vector<int>> howSum(int targetSum, const vector<int>& numbers) { // 目标和为0,返回空数组表示找到合法解 if (targetSum == 0) return vector<int>{}; // 目标和为负,无合法解,返回nullopt对应JS的null if (targetSum < 0) return nullopt; // 范围for循环,和JS的for of逻辑完全一致 for (int num : numbers) { int remainder = targetSum - num; auto remainderResult = howSum(remainder, numbers); // 子递归返回了有效解 if (remainderResult.has_value()) { // 把当前数字追加到解的末尾,对应JS的[...remainderResult, num] remainderResult->push_back(num); return remainderResult; } } // 所有数字都尝试过无合法解,返回nullopt return nullopt; } // 调用示例 int main() { vector<int> nums = {2, 3}; auto result = howSum(7, nums); if (result.has_value()) { for (int n : result.value()) { cout << n << " "; } } else { cout << "没有找到合法组合" << endl; } return 0; }
兼容C11/C03的实现方案
如果你用的编译器不支持C++17,可以用返回bool+引用传结果的方式实现:
#include <vector> #include <iostream> using namespace std; bool howSum(int targetSum, const vector<int>& numbers, vector<int>& result) { if (targetSum == 0) { result.clear(); return true; } if (targetSum < 0) { return false; } for (int num : numbers) { int remainder = targetSum - num; vector<int> tempResult; if (howSum(remainder, numbers, tempResult)) { tempResult.push_back(num); result = tempResult; return true; } } return false; } // 调用示例 int main() { vector<int> nums = {2, 3}; vector<int> result; bool hasSolution = howSum(7, nums, result); if (hasSolution) { for (int n : result) { cout << n << " "; } } else { cout << "没有找到合法组合" << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Display Smoker
相关产品推荐
相关产品推荐

