Member 14836444 Ответов: 4

Здравствуйте, ребята, я хотел бы знать, почему эта отдача умножается


Я действительно Новичок в кодировании и хотел бы знать, почему это происходит:
static void Main(string[] args)
{
	int number = 5;

	int result = factorial(number);

	Console.WriteLine(result);
}


public static int factorial(int number)
{
	if (number ==0 )
	{
		return 1;
	}

	else
	{
		return number * factorial(number - 1);
	}
}


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

Это простой код, использующий рекурсию для получения факториала, я понимаю оператор "else", который умножается, чтобы получить факториал числа.

Это умножение повторяется до тех пор, пока мы не получим число 0. Поскольку по умолчанию мы записали наш возвращаемый результат для нуля как 1, конечный результат будет умножен на 1.

вопрос в том, почему он получает умножение, так как я не использовал никакого оператора в операторе if?

4 Ответов

Рейтинг:
2

phil.o

Умножение происходит только в другой части.
Возьмем, к примеру, факториал(3) :

  • факториал(3) -> 3 * факториал(2)
    • факториал(2) -> 2 * факториал(1)
      • факториал(1) -> 1 * факториал(0)
        • факториал(0) -> 1
      • факториал(1) = 1 * 1 = 1
    • факториал(2) = 2 * 1 = 2
  • факториал(3) = 3 * 2 = 6

Вы можете вернуть 1, проверив, есть ли number является единицей вместо нуля, это избавило бы от рекурсии и не изменило бы конечный результат.

Чтобы лучше понять процесс, поставьте точку останова на if постройте и запустите сеанс отладки (F5 в Visual Studio). Вы сможете выполнять построчно (F11) и видеть поток программы.


Рейтинг:
2

Member 14836444

public static int factorial(int number)
{

Приставка.WriteLine("Im calculating {0} ", number);

если (число == 0)
{
возврат 1;
}


int f= число * факториал(число - 1);
Приставка.WriteLine("готово! {0} = {1} " ,число,f );

возврат f;

}


static void Main(string[] args)
{



int number = 5;
int result = факториал(число);
Приставка.WriteLine(результат);


}
}



Спасибо всем за ваши ответы и вашу помощь, во время отладки и добавления writelines это стало совершенно ясно. Желаю вам приятного и еще раз спасибо.


Рейтинг:
1

Wendelius

Во-первых, чтобы понять поведение, лучше всего использовать отладчик. Поместите точку останова в свой Main метод и выполнить код шаг за шагом, исследуя значения переменных. Это поможет вам понять, что происходит. Для получения некоторых инструкций взгляните на Первый взгляд на отладчик - Visual Studio | Microsoft Docs[^]

Что касается собственно вопроса, то оператор находится в ветке else. В последний раз рекурсия называется number содержит 1, поэтому рекурсивный вызов получит 0 в качестве входных данных и вернет 1.

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

Но, как уже было сказано, это хорошо видно при выполнении с помощью отладчика.


Member 14836444

Вы гений!, "рекурсивный вызов производится до умножения, каждое возвращаемое значение из рекурсии будет умножаться после всех вложенных рекурсий, позволяя каждой внутренней рекурсии возвращать значение из умножения на вызывающий уровень", я задавал этот вопрос в нескольких местах, все они говорили: читайте руководство, возьмите курс C#, но вы отвечаете так хорошо. Спасибо, я действительно ценю это!. Я хочу когда-нибудь узнать столько же, сколько и ты!. Кроме того, что вы ходите на курсы, как вы так много узнаете?, я впечатлен

BillWoodruff

+5

Рейтинг:
0

Patrice T

Цитата:
итак, возникает вопрос: почему он получает умножение, поскольку я не использовал никакого оператора в операторе if?

Это не так, как это работает, "возврат 1" не умножается в "если".
Лучше всего посмотреть, как работает рекурсивный код, инструментом выбора для этого является отладчик.
Совет: сравнение с нерекурсивной версией может помочь понять разницу и то, как она работает.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.