Это вопрос домашней работы, поэтому, хотя я бы хотел использовать полезный код, то, что я действительно ищу, - это понимание того, как решить эту проблему. У меня есть два отсортированных массива в порядке возрастания, которые мне нужно объединить в рекурсивной функции. Кажется, мне нужно создать сортирующую часть алгоритма сортировки слиянием. Требования заключаются в том, что рекурсивная функция может принимать только две отсортированные строки в качестве параметров и не может использовать глобальные или статические переменные.
Я думаю, что psuedocode:
Мои вопросы: как сохранить строку результата, если я не могу использовать статические переменные? Я видел код, где строка определяется как = для оператора return рекурсивного вызова. Будет ли это работать в этом случае?
Второй вопрос - как увеличить функцию. Мне нужно вызвать substr (1, size-1) после первой итерации, а затем увеличить, не используя статические переменные.
Здесь моя попытка решить уравнение со статическими переменными (которые недопустимы):
static string result="";
static int vv=0;
static int ww=0;
if(v.size()==0 && w.size()==0)
return result;
if(w.size()==0 || v.substr(0,1) <= w.substr(0,1)){
result+=v.substr(0,1);
vv++;
return spliceSortedStrings( v.substr(vv,v.size()-vv) , w);
}
else if(v.size()==0 || w.substr(0,1) > v.substr(0,1)){
result+=w.substr(0,1);
ww++;
return spliceSortedStrings( v , w.substr(ww,w.size()-ww));
}
Я буду благодарен за любое руководство.
Как насчет этого:
std::string merge(std::string a, std::string b) {
if (a.size() == 0) return b;
if (b.size() == 0) return a;
if (a.back() < b.back()) {
std::string m = merge(a, b.substr(0, b.size()-1));
return m + b.back();
}
else {
std::string m = merge(a.substr(0, a.size()-1), b);
return m + a.back();
}
}
Правильность и окончание должны быть очевидными, и я думаю, что он должен соответствовать ограничениям, которые вы даете. Но мне интересно, какой учитель поставил бы такую задачу в C++, поскольку приведенный выше код примерно такой же неэффективен, как может быть.
substr()
бесполезны, когда все, что вас волнует, этоfront()
(при условии, что!empty()
был проверен).substr()
стоит дорого , поскольку каждый генерирует новую выделенную независимую строку.