问题在于我正在实现一个递归,其中必须使用 NULL
值来指定遍历的递归分支无效。
但是在C++中,当返回类型为容器(例如我的vector容器)时,不能返回 NULL
。
那么是否有解决该问题的方法,还是我必须使用其他逻辑?
代码:
#include<iostream>
#include<vector>
std::vector<int> howSum(int target,std::vector<int> in){
if(target < 0 ) return {-1};
if(target == 0) return {};
for(int num : in){
int remainder = target - num ;
std::vector<int> remResult = howSum(remainder,in);
if(remResult[0] != -1 || remResult.empty()){
remResult.push_back(num);
return remResult;
}
}
return {-1};
}
int main(){
std::vector<int> v = {2,4,3};
int targetSum = 8;
std::vector<int> r = howSum(targetSum,v);
for(int o : r)
std::cout<<o<<" ";
return 0;
}
编辑:
非常感谢所有的建议和解决方案,但我想要一个不使用更近的c++编译器(即c++17和c++20)的基本解决方案。 如果可能的话,请查看我自己实现的基本解决方案并提出建议,看看是否可以改进。
我找到了一种替代解决方案(基本方法)
我写这篇文章是为了给来参考这个问题的人。
解决方案:
#include<iostream>
#include<vector>
#include<string>
std::string howSum(int target,std::vector<int> v){
if(target == 0) return "";
if(target < 0) return "null";
for(int num : v){
int rem = target - num;
std::string remRes = howSum(rem,v);
if(remRes != "null"){
remRes += std::to_string(num);
remRes += " ";
return remRes;
}
}
return "null";
}
int main()
{
std::vector<int> v = {2,3,4};
int targetSum = 8;
std::cout<<howSum(targetSum,v);
return 0;
}
我的动态问题解决方案
#include<iostream>
#include<vector>
#include<string>
#include<unordered_map>
std::unordered_map<int,std::string> mem;
std::string howSum(int target, std::vector<int> v){
if(mem.find(target) != mem.end())
return mem[target];
if(target == 0) return "";
if(target < 0) return "null";
for(int num : v){
int rem = target - num;
std::string remRes = howSum(rem,v);
if(remRes != "null"){
remRes += std::to_string(num);
remRes += " ";
mem[target] = remRes;
return mem[target];
}
}
mem[target] = "null";
return mem[target];
}
int main()
{
std::vector<int> v = {7,14};
int targetSum = 300;
std::cout<<howSum(targetSum,v);
return 0;
}
std::pair<bool, whatever>
可以作为 C++14 中optional
的有效替代品。 - IWonderWhatThisAPIDoesstd::optional
的基础,但void*
使其有些不完整。在这个想法的基础上构建一个答案。 - Ted Lyngmo