【问题标题】:How to convert this JavaScript code to C++如何将此 JavaScript 代码转换为 C++
【发布时间】:2021-12-24 12:20:37
【问题描述】:

问题是从给定数组中返回任何一个组合,总和为目标。我是 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;
};

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
        }
    }
}

【问题讨论】:

  • edit您的问题并直接在问题中以文本形式提供所有代码。
  • 需要区分null返回和空std::vector吗?
  • @StephenNewell 完成
  • @Galik 是的,我也遇到了这个问题。如何在“if 语句”中捕获返回值是否为“null”或“空向量”?
  • 你可以使用std::optional

标签: c++ recursion vector data-structures


【解决方案1】:

您可以使用 C++17 std::optional 并在它不包含值时返回 std::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;
}

【讨论】:

    【解决方案2】:

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2019-09-29
      • 2011-12-08
      相关资源
      最近更新 更多