average_angela Ответов: 1

У меня есть код для задачи Иосифа Флавия с использованием рекурсии но я не совсем понимаю ее может кто нибудь мне объяснить


вы можете увидеть проблему Иосифа Флавия на Проблема Иосифа Флавия - Википедия[^] и я уже знаю решение, которое не использует рекурсию, но я действительно хочу знать, как это работает. в этом случае я использую Шаг 2, который означает, что когда он удаляет n(число), то он прыгает n+1, а затем удаляет n+2.

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

<pre>
#include <stdio.h>
#include <stdlib.h>
int winner(int n){
if (n==1)
    return 1;
else
    return (winner(n-1)+1)%n+1;
}
int main()
{
    int n;
    scanf("%d", &n);
printf("%d", winner(n));
    return 0;
}

1 Ответов

Рейтинг:
6

OriginalGriff

Что тут объяснять? Либо вы понимаете рекурсию, либо вам нужно ее изучить.
Научиться рекурсии очень просто: просто изучите рекурсию.

Метод winner вызывается с определенным значением для n. Если он не один (то есть выигрышная позиция), он называет себя с n минус один и использует результат от этого для вычисления выигрышной позиции.
Если вы понимаете, как работает Рекурсия, это довольно ясно.

Так что берите отладчик и выполняйте код до конца. Сначала стоит быстро переодеться. Изменить это:

return (winner(n-1)+1)%n+1;

до настоящего времени:
{
int res = winner(n-1);
res = res + 1;
res = res % n + 1;
return res;
}
Таким образом, вы можете точно следить за тем, что делается (и возвращается) на каждом этапе.