尝试在 C++ 中从 JS 重新创建这段代码

问题描述

我看过一门关于动态编程的课程,老师用 JS 解决了这样的问题。

我理解逻辑,但现在我必须用C++编写它。这是他的代码

photo

我正在尝试过渡到 C++,但被一些错误所困扰:

std::vector<int> howSum(std::vector<int> numbers,int target)
{
    if (target == 0) return std::vector<int>();
    if (target < 0) return NULL; /*this doesn't work here because NULL is of type int - what should I do?*/

    for (int num : numbers)
    {
        int remainder = target - num;
        std::vector<int> remainderResult = howSum(numbers,remainder);
        if (remainderResult != NULL) /*doesn't work*/
        {
            return remainderResult.push_back(num);
        }
    }

    return NULL; /*doesn't work*/
}

我真的不知道我应该如何像他在 JS 中那样返回 null 并与 null 进行比较,我认为这是我代码的主要问题。

我该怎么做?

解决方法

与 JavaScript 不同,C++ 变量不能保存 null 的值。 NULL 不是它的替代品 - 这只是写 0 的一种奇特方式。从 C++17 开始,标准库有一个可空类型的模板:std::optional(参见 cppreference)。它的语法部分模仿了指针。

此外,push_back() 不返回结果向量,必须将 return 拆分为单独的语句。

通过这些更改,您的源代码应如下所示:

std::optional<std::vector<int>> howSum(std::vector<int> numbers,int target)
{
    if (target == 0) return std::vector<int>();
    if (target < 0) return std::nullopt; 

    for (int num : numbers)
    {
        int remainder = target - num;
        std::optional<std::vector<int>> remainderResult = howSum(numbers,remainder);
        if (remainderResult != std::nullopt) 
        {
            remainderResult->push_back(num);
            return remainderResult;
        }
    }

    return std::nullopt;
}