259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
1

Задача: Лестница

04.06.2022, 23:32. Показов 1006. Ответов 10

Author24 — интернет-сервис помощи студентам
Имеется рабочая программа на "старом" Паскале, которая рекурсивно находит количество вариантов прохождения заданной лестницы с вариантом шага на 1, 2 или 4 ступени.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var
  всего: longint;
  ступени: integer;
 
procedure шаг(ход: integer);
begin
  if ход - 1 = 0 then inc(всего) //последний 1 шаг
  else
  if ход > 0 then
  begin
    if (ход - 2) = 0 then inc(всего)  //последний 2 шаг
         else
    if (ход - 2 > 0) then шаг(ход - 2);
    
    if (ход - 4) = 0 then inc(всего)  //последний 4 шаг
          else 
    if (ход - 4) > 0 then шаг(ход - 4);  
  end;
end;
 
begin
  всего := 0;
  write('Длина лестницы= ');
  readln(ступени);
  шаг(ступени);
  writeln('Всего вариантов: ', всего);
end.
Однако теперь нужно показать допустимые варианты.
Я посоветовал PascalABC.NET, и учитель вроде не возражает.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2022, 23:32
Ответы с готовыми решениями:

Олимпиадная задача. Лестница из кубиков.
1) Мальчик Петя строит из кубиков лестницу. Лестница представляет собой несколько стоящихся рядом...

Лестница
Дано натуральное число n.Человек должен подняться по лестнице,имеющей n ступеней.Зная что с каждым...

Лестница
Человек поднимается по лестнице один марш которых содержит N ступенек. За один шаг человек может...

Вывести на экран таблицу "Лестница нулей"
Написать программу, выдающую на экран таблицу «Лестница нулей» 0123456789 0012345678...

Задача на циклы - Лестница
Дан массив, элементы которого описывают лестницу,каждый элемент - ступень . На первой ступени сидит...

10
5077 / 2649 / 2349
Регистрация: 10.12.2014
Сообщений: 10,024
05.06.2022, 09:56 2
Цитата Сообщение от Yuri V Посмотреть сообщение
Имеется рабочая программа на "старом" Паскале
А вы именно эту программу не пробовали запускать „на "старом" Паскале“?
Цитата Сообщение от Yuri V Посмотреть сообщение
Я посоветовал PascalABC.NET
Ну, так-так!
С этого места поподробнее…
Т.е. вы посоветовали,
а делать должны мы?
0
2300 / 1413 / 514
Регистрация: 07.04.2017
Сообщений: 4,713
05.06.2022, 09:57 3
Перепишите оригинальное задание, этот код выглядит как очень страшное усложенение простейшей логики. Должны быть достаточно case с 5 вариантами.
0
259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
05.06.2022, 11:24  [ТС] 4
JuriiMW, а если чуть подумать над значением фразы рабочая, т.е. принятая учителем программа? Да никто не заставляет: есть что подсказать по выводу рекурсии или структуры в целом - хорошо, нет - тоже нормально, но не тратьте буквы, дышите. Хотя точнее указывать "в стиле или духе старого Паскаля", но по коду и ежу понятно.

А лично мне пока ничего особо в голову пока не приходит, потому что если делать по старинке - показывает странный вывод (см. ниже).


Sun Serega, логика прямо в процедуре: cколько вариантов можно сделать по 2 или 4 шага чтобы пройти заданную лестницу, при необходимости делая последний шаг для нечётных?
Вариант с таким выводом-
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure шаг(ход: integer);
begin
  if ход - 1 = 0 then begin writeln(1);inc(всего)end //последний 1 шаг
  else
  if ход > 0 then begin
    if (ход - 2) = 0 then begin writeln(2);inc(всего)end  //последний 2 шаг
         else
    if (ход - 2 > 0) then begin Write(2);шаг(ход - 2)end;
    
    if (ход - 4) = 0 then begin writeln(4);inc(всего)end  //последний 4 шаг
          else 
    if (ход - 4) > 0 then begin Write(4);шаг(ход - 4)end;  
  end;//IF
end;
как-то не так, потому что
Длина лестницы= 6
222 +
4 <---- что это такое? Почему пропускает единицы?
42 +
Всего вариантов: 3
Задача не моя, не я её делал, но засчитана как правильная, а как появится лицеист - уточню.

Добавлено через 2 минуты
Хотя без контрольных примеров не исключена безалаберность как учителя, так и исполнителя.
0
2300 / 1413 / 514
Регистрация: 07.04.2017
Сообщений: 4,713
05.06.2022, 11:29 5
Цитата Сообщение от Yuri V Посмотреть сообщение
пропускает единицы?
А каким образом должна получится еденица, при отнимании чётных (2 и 4) от чётного (6)?

Добавлено через 1 минуту
Ну в любом случае, таки ждём задание.
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
05.06.2022, 12:56 6
Переменная "ход" имеет какой-то физический смысл?
Потому, что в процедуре всего одна переменная и три константы (величины шага) - 1, 2 и 4.
0
259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
05.06.2022, 14:03  [ТС] 7
ФедосеевПавел, логично, это обычная рекурсия с вариантами ходов.
Проще говоря, нужно "2"-ками и "4"-ками набрать заданную сумму, при необходимости дополнив "1", но условие уточню.

Меня больше интересует почему процедура засчитывает неполные варианты как с "4" выше.
Вполне возможно, что Sun Serega прав и я перепутал выход из частичной рекурсии за полный ответ (всю цепочку).
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure шаг(ход: integer);
begin
  write('[',ход,']');
  if ход - 1 = 0 then begin writeln(1);inc(всего)end //последний 1 шаг
  else
  if ход > 0 then begin
    if (ход - 2) = 0 then begin writeln(2);inc(всего)end  //последний 2 шаг
         else
    if (ход - 2 > 0) then begin Write(2);шаг(ход - 2)end;
    
    if (ход - 4) = 0 then begin writeln(4);inc(всего)end  //последний 4 шаг
          else 
    if (ход - 4) > 0 then begin Write(4);шаг(ход - 4)end;  
  end;//IF
end;
Длина лестницы= 6
[6]2[4]2[2]2
4
4[2]2
Всего вариантов: 3
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
05.06.2022, 16:48 8
Переменная "ход" - это номер текущей ступени лестницы.

Если сделать стек (хоть на существующих типах, хоть на массиве), в который заносить номера ступеней (переменные "шаг"), то после того, как будет получено условие "шаг"=0 (if ход - 1 = 0) и опустошать на один элемент перед выходом из подпрограммы, то из этого стека можно вывести все номера ступеней лестницы, через которые проходит данное полученное решение.
1
5077 / 2649 / 2349
Регистрация: 10.12.2014
Сообщений: 10,024
05.06.2022, 17:10 9
Вообще — это задание на динамическое программирование.
Здесь просто нужен линейный массив.
0
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
05.06.2022, 19:51 10
Если речь о подсчёте количества вариантов решения.
Но преподаватель усложнил задание
Цитата Сообщение от Yuri V Посмотреть сообщение
Однако теперь нужно показать допустимые варианты.
Добавлено через 2 часа 4 минуты
У меня нет PABC.NET, но и на FPC алгоритм ясен.
Для N=6 получаю количество вариантов прохождения лестницы не 3, а 18.[PASCAL]
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
program test;
 
var
  Path: array of integer;
  Len:  integer;
 
  procedure ShowPath;
  var
    i: integer;
  begin
    for i := 0 to Len - 1 do
      Write(Path[i], ' ');
    writeln;
  end;
 
  function Step(N: integer): integer;
  begin
    if N = 0 then
    begin
      ShowPath;
      Step := 1;
      exit;
    end;
    Path[Len] := N;
    Inc(Len);
    Step:=0;
    if N >= 1 then
      Step := Step + Step(N - 1);
    if N >= 2 then
      Step := Step + Step(N - 2);
    if N >= 4 then
      Step := Step + Step(N - 4);
    Dec(Len);
  end;
 
var
  N: integer;
  Count: integer;
begin
  N := 6;
  SetLength(Path, N);
  Count := Step(N);
  writeln('Count ', Count);
end.
Добавлено через 3 минуты
В коде из сообщения #1 ошибка - не рассматривается вариант перехода на ступень +1
1
3015 / 1641 / 648
Регистрация: 19.03.2019
Сообщений: 5,310
06.06.2022, 09:49 11
Лучший ответ Сообщение было отмечено Yuri V как решение

Решение

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
У меня нет PABC.NET, но и на FPC алгоритм ясен.
на PascalABC.NET ваш вариант можно записать так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
program test;
 
var
  Path: array of integer;
  Len:  integer;
 
  procedure ShowPath;
  var
    i: integer;
  begin
    for i := 0 to Len - 1 do
      Write(Path[i], ' ');
    writeln;
  end;
 
  function Step(N: integer): integer;
  begin
    if N = 0 then
    begin
      ShowPath;
      Step := 1;
      exit;
    end;
    Path[Len] := N;
    Inc(Len);
    result:=0;
    if N >= 1 then
      result := result + Step(N - 1);
    if N >= 2 then
      result := result + Step(N - 2);
    if N >= 4 then
      result := result + Step(N - 4);
    Dec(Len);
  end;
 
var
  N: integer;
  Count: integer;
begin
  N := 6;
  SetLength(Path, N);
  Count := Step(N);
  writeln('Count ', Count);
end.
ну, или так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var
  Path: array of integer;
  Len:  integer;
 
  function Step(N: integer): integer;
  begin
    if N = 0 then
    begin
      Path[0:len].Println;
      Step := 1;
      exit;
    end;
    Path[Len] := N;
    Inc(Len);
    result:=0;
    if N >= 1 then
      result := result + Step(N - 1);
    if N >= 2 then
      result := result + Step(N - 2);
    if N >= 4 then
      result := result + Step(N - 4);
    Dec(Len);
  end;
 
begin
  var N := 6;
  SetLength(Path, N);
  writeln('Count ', Step(N));
end.
1
06.06.2022, 09:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2022, 09:49
Помогаю со студенческими работами здесь

Задача "Платная лестница"
Мальчик подошел к платной лестнице. Чтобы наступить на любую ступеньку, нужно заплатить указанную...

Лестница
Мальчик Петя строит из кубиков лестницу. Лестница представляет собой несколько строящихся рядом...

лестница
int phi(int n) {int a; a=1; a=2; if (n==1) return a; else a=phi(a+n-1); } как правльно...

Лестница
у меня то же часто бывает, и в основном не по тем запросам под которые работаю. бывает с одной...

Криволинейная лестница
Помогите, пожалуйста, понять, как можно переделать вот эту винтовую лестницу на криволинейную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru