Svetarozen
27.12.2021 06:55

Python. Рекурсии.
Фишки

Дана полоска из клеток, пронумерованных от 1 до N слева направо. Разрешено снимать или ставить фишку на клетку с номером 1 или на клетку, следующую за самой левой из установленных фишек (правее неё), если она пуста. Изначально полоска пуста. Нужно разместить фишки во всех клетках.

Входные данные

Программа получает на вход количество клеток в полоске N(1≤N≤10).

Выходные данные

Программа должна вывести последовательность номеров клеток, с которыми совершается действие. Если фишка снимается, то номер клетки должен выводиться со знаком минус. Количество действий не должно превышать 104. Если существует несколько возможных решений задачи, то разрешается вывести любое.

Примеры:
Ввод:
3
Вывод:
1 2 -1 3 1

Программа(работает только с нечётными числами, на других зависает):
from sys import setrecursionlimit
setrecursionlimit(10**9)
def f(a,i):
if a == 1:
print(1,end = ' ')
elif i == a - 1:
print(i+1,end = ' ')
f(a-2,1)
else:
print(i+1,-i,end = ' ')
f(a,i+1)
a = int(input())
print(1,end = ' ')
f(a,1)

Нажмите на рекламу ниже и сразу увидите ответ
Популярные вопросы:
Ответ:
Deafandblind
16.05.2021 04:18
1. Современное решение, когда можно решить "в одну строку"

// PascalABC.NET 3.2, сборка 1439 от 09.05.2017
// Внимание! Если программа не работает, обновите версию!

begin
  Writeln('S=',ReadSeqInteger(3).Select(n->n.ToString
    .Where(d->Pos(d,'13579')>0)).SelectMany(c->c)
    .Select(c->c.ToDigit).Sum)
end.

Пример
252 337 105
S=24

2. А примерно вот так учат писать в школе - долго и длинно (да и не особо понятно)

var
  m,i,j,s,d:integer;
begin
  s:=0;
  for i:=1 to 3 do begin
    Read(m);
    for j:=1 to 3 do begin
      d:=m mod 10;
      if d mod 2<>0 then s:=s+d;
      m:=m div 10
      end
    end;
  Writeln('S=',s)
end.
0,0(0 оценок)
Ответ:
topova1
16.05.2021 04:18
1. Современное решение, когда можно решить "в одну строку"

// PascalABC.NET 3.2, сборка 1439 от 09.05.2017
// Внимание! Если программа не работает, обновите версию!

begin
  Writeln('S=',ReadSeqInteger(3).Select(n->n.ToString
    .Where(d->Pos(d,'13579')>0)).SelectMany(c->c)
    .Select(c->c.ToDigit).Sum)
end.

Пример
252 337 105
S=24

2. А примерно вот так учат писать в школе - долго и длинно (да и не особо понятно)

var
  m,i,j,s,d:integer;
begin
  s:=0;
  for i:=1 to 3 do begin
    Read(m);
    for j:=1 to 3 do begin
      d:=m mod 10;
      if d mod 2<>0 then s:=s+d;
      m:=m div 10
      end
    end;
  Writeln('S=',s)
end.
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота