Thaksha Ответов: 2

Как остановить рекурсивный вызов при запуске программы на языке Си#


Я помещаю возврат в конкретное условие, используя оператор if внутри метода, но моя программа снова вызывает этот метод, потому что он рекурсивный m+d.. вот почему я прошу прекратить весь m+d в этом состоянии, не вызывая m+d снова..

Что я уже пробовал:

public void subset(string[] A, int k, int start, int currLen, bool[] used, int tot)
        {
if(---
  return    --terminate
    if (start == A.Length)
                {
                    return;
                }
                          
                used[start] = true;

                subset(A, k, start + 1, currLen + 1, used, tot);
                

                used[start] = false;
                subset(A, k, start + 1, currLen, used, tot);
            }
        }

Patrice T

Обновите свой вопрос реалистичным кодом.

Graeme_Grant

Я согласен... чрезмерно расплывчатое и форматирование затрудняет чтение.

2 Ответов

Рейтинг:
1

Simon_Whale

Честно говоря,я не уверен, что ваш пример кода пытается передать здесь.

Я бы прочитал об этом Рекурсивные методы с использованием C#[^]


Рейтинг:
0

Avi Farah

Если я проигнорирую начало "если(---
вернуться, завершить"

и я игнорирую лишнюю закрывающую скобку "}"

Тогда мне кажется, что ваша программа завершается

Так например я попробовал:
подмножество (new string[] { "Abc", "Def"}, 0, 0, 0, new bool[2], 0);

и это прекратилось.

Однако вы говорили о m + d, которого я не понял,хотя вы дважды рекурсивно вызываете подмножество...

Пожалуйста, будьте более конкретны в своем вопросе.


Thaksha

Просто я хочу остановить выполнение всего рекурсивного вызова в одном конкретном условии (оператор if), что означает, что моя программа не будет вызывать метод снова после этого условия и показывать результат до этого состояния.

Avi Farah

Ваш вопрос слишком расплывчат.

В общем чтобы написать рекурсивную программу вам нужно:
1. Рекурсивное определение и
2. Завершающий состоянии.

Ваше завершающее условие проверяется перед вашим рекурсивным вызовом, и рекурсивный вызов должен приблизить вас к завершающему условию, оценивающему true, иначе вы окажетесь в бесконечной рекурсии.

Надеюсь, это поможет,
Ави

Thaksha

Спасибо за ваш ответ....Я уже знаю, что рекурсивный вызов должен иметь завершающее условие для завершения метода. Но у меня есть проблема, когда я ставлю условие завершения, а затем вызываю его снова, потому что рекурсивная функция имеет дело со стековой памятью.
Поэтому мне нужны комбинации без рекурсии в c#.
Когда я ставлю входные данные как A, B,C,D
выход должен быть похож на A B C D
A B C
A B D
С Д
B C D
А Б
С
Д
Б
B D
C D
Один
Б
С
Д
Так что у вас есть или вы знаете какие-либо коды для этого.

Avi Farah

Опять же, ваш вопрос слишком расплывчат,чтобы я мог комментировать детали. Мы все еще имеем дело с тем же алгоритмом? Как буквы A, B, C, D применяются к алгоритму.

Я чувствую, что вам нужно следовать своей логике, которую вы не опубликовали.

То, что приходит на ум о вашем двойном рекурсивном вызове, - это ряд Фибоначчи:
Фибоначчи[0] = f0 (константа, скажем, 0)
Фибоначчи[1] = f1 (другая константа, скажем, 1)
Фибоначчи[n] = Фибоначчи[n-2] + Фибоначчи[n-1]

Это двойной рекурсивный вызов (кстати, очень дорогое вычислительное время)

Однако мы можем упростить/удешевить его: рассмотрим кортеж из 2 чисел, обозначаемый (x, y), тогда:
fib[0] = (f0, f1)
мерцательная аритмия[Н] = следующий(мерцательная аритмия[Н-1])

куда дальше( (х,г) ) = (г, х + г)

и Фибоначчи [n] = fib[n].Первый

Теперь нам удалось уменьшить рекурсивный вызов 2 до 1.

Надеюсь, это поможет.
Ави