Нужна помощь в создании рекурсивной функции без множественных возвратов - PullRequest
0 голосов
/ 07 мая 2019

Я бы хотел задать вопрос о проекте, который я должен сделать для моего курса процедурного программирования. Тест хочет, чтобы я решил эту проблему:

Заранее я должен сказать, что для «двух наборов действительных чисел» я использовал два связанных списка, а не массивы. Проблема заключается в том, что у моего профессора есть список «не выполненных» вещей, которым я должен следовать, чтобы выполнить тест без штрафа, и настоящая проблема заключается в том, что он не хочет многократных «возвратов» внутри тела. функции, и я не знаю способ сделать эту рекурсивную функцию без множественных выходов, я был бы очень признателен за помощь от кого-то, кто может решить эту проблему.

Для этой задачи я создал два набора действительных чисел в виде двух связанных списков в следующей структуре:

typedef struct elem_list {
    int info;
    struct elem_list *next;
}   elem_list_t;

В основной программе два списка создаются пользователем из ввода и называются list_A и list_B.

1 Ответ

0 голосов
/ 07 мая 2019

Если вы хотите рассчитать объединения и пересечения, вам нужно, чтобы данные были отсортированы заранее.

Математические множества лучше всего реализовывать в виде отсортированных двоичных деревьев. С этого момента рекурсия становится вполне естественной, поскольку алгоритмы двоичного дерева часто реализуются как рекурсивные. Поиск, сортировка, балансировка и т. Д. Таким образом, основная часть этого назначения должна быть посвящена реализации абстрактного типа данных для двоичного дерева.

Что касается множественных возвратов, не имеет смысла их догматически избегать, хотя, возможно, учитель хочет убедиться, что вы используете так называемую "хвостовую рекурсию" с рекурсивным вызовом в самом конце функции. Потому что обычно это единственный вид рекурсии, который компилятор может хорошо оптимизировать - все остальные формы рекурсии ужасно медленны.

...