C ++ рекурсивная строка слияния

0

Это вопрос домашней работы, поэтому, хотя я бы хотел использовать полезный код, то, что я действительно ищу, - это понимание того, как решить эту проблему. У меня есть два отсортированных массива в порядке возрастания, которые мне нужно объединить в рекурсивной функции. Кажется, мне нужно создать сортирующую часть алгоритма сортировки слиянием. Требования заключаются в том, что рекурсивная функция может принимать только две отсортированные строки в качестве параметров и не может использовать глобальные или статические переменные.

Я думаю, что psuedocode:

  • если размер двух строк == 0, то верните строку результата.
  • сравните substr (0,1) каждой строки, чтобы увидеть, что меньше, и добавьте ее в строку результата
  • рекурсивно вызывать функцию с новыми параметрами, являющимися подстрокой строки, которая добавлена

Мои вопросы: как сохранить строку результата, если я не могу использовать статические переменные? Я видел код, где строка определяется как = для оператора 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));
    }

Я буду благодарен за любое руководство.

  • 0
    Извините, но я что-то пропустил. смысл этого упражнения в том, чтобы взять две строки отсортированных символов и рекурсивно объединить их в одну строку, в которой также отсортированы результаты? И независимо от того, является ли это целью или нет, повторные вызовы substr() бесполезны, когда все, что вас волнует, это front() (при условии, что !empty() был проверен). substr() стоит дорого , поскольку каждый генерирует новую выделенную независимую строку.
  • 0
    Да, это были требования упражнения.
Показать ещё 3 комментария
Теги:
string
recursion
mergesort

1 ответ

1
Лучший ответ

Как насчет этого:

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++, поскольку приведенный выше код примерно такой же неэффективен, как может быть.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню