如何将此 JavaScript 代码转换为 C++

Dis*_*ker 3 c++ recursion vector data-structures

问题是返回给定数组中总和达到目标的任意一种组合。我是 C++ 新手。如何完成下面的函数howSum()?我不能在这里返回 null,因为返回类型是向量。另外,我在传递向量时遇到了麻烦。

JavaScript:

const howSum = (targetSum, numbers) => {
    if (targetSum === 0) return [];
    if (targetSum < 0) return null;

    for (let num of numbers) {
        const remainder = targetSum - num;
        const remainderResult = howSum(remainder, numbers);
        if (remainderResult !== null) 
        {
            return [...remainderResult, num];
        }
    }
    return null;
};
Run Code Online (Sandbox Code Playgroud)

C++:

vector<int> howSum(int targetSum, vector<int> numbers)
{
    if(targetSum == 0) return {};
    if(targetSum < 0) return; //can't return null here in C++
    for (int i = 0; i < numbers.size(); i++)
    {
        int remainder = targetSum - numbers[i];
        vector<int> remainderResult = howSum(remainder, numbers);
        if(pass)
        {
            pass
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

sel*_*bie 6

让您的函数返回一个布尔值来指示向量结果(作为输出参数返回)是否有效。无论如何,将数组(向量)作为输出参数引用传递可能比作为返回值更有效。(尽管现在现代编译器可以进行一些惊人的优化。)

bool howSum(int targetSum, const std::vector<int>& numbers, std::vector<int>& result)
{
    result.clear();

    if (targetSum == 0) {
        return true;
    }

    if (targetSum < 0) {
        return false;
    }

    for (int num : numbers) {
        const int remainder = targetSum - num;
        bool recursion_result = howSum(remainder, numbers, result);
        if (recursion_result) {
            result.push_back(num);
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)


康桓瑋*_*康桓瑋 6

您可以使用 C++17std::optionalstd::nullopt在它不包含值时返回。

#include <optional>
#include <vector>

std::optional<std::vector<int>> 
howSum(int targetSum, const std::vector<int>& numbers) {
  if (targetSum == 0) 
    return std::vector<int>{};
  if (targetSum < 0) 
    return std::nullopt;
  for (auto numer : numbers) {
    const auto remainder = targetSum - numer;
    auto remainderResult = howSum(remainder, numbers);
    if (remainderResult) {
      remainderResult->push_back(targetSum);
      return remainderResult;
    }
  }
  return std::nullopt;
}
Run Code Online (Sandbox Code Playgroud)