Списки и около того

Разбор позапрошлого Д/З.

Понятие «протокола» или «что такое утка?»:

Списки

(если успеем) Замещение рекурсии стеком

Пример: НОД

   1 def nod(a,b):
   2     '''Рекурсивный вариант'''
   3     return nod(b, a%b) if b else a
   4 
   5 def nodC(a,b):
   6     '''Нерекурсвный вариант
   7     Стек не нужен!'''
   8     while b:
   9         a, b = b, a%b
  10     return a

Пример: черепашка

   1 import turtle
   2 
   3 def spyro(size, minsize, angle):
   4     '''Рекрсивный вариант'''
   5     turtle.forward(size)              # действия до вызова
   6     turtle.left(angle)
   7     if(size>minsize):
   8         spyro(size-2, minsize, angle) # size = size-2 ⇒ в контекст
   9     turtle.right(angle)               # действия после вызова
  10     turtle.back(size)
  11 
  12 def spyro2(size, minsize, angle):
  13     '''Нерекурсивный вариант'''
  14     stack = [[size, "forward"]] # размер и стадия
  15     while stack:
  16         if stack[-1][1] == "forward":
  17             turtle.forward(stack[-1][0])
  18             turtle.left(angle)
  19             stack[-1][1] = "backward"
  20             if(stack[-1][0]>minsize):
  21                 stack.append([stack[-1][0]-2, "forward"])
  22                 continue
  23         elif stack[-1][1] == "backward":
  24             turtle.right(angle)
  25             turtle.back(stack[-1][0])
  26             stack.pop()

Д/З

  1. Прочитать и прощёлкать десятую главу учебника и в Tutorial

  2. EJudge: SortedSin 'Сортировка по синусам'

    Ввести список вещественных чисел и отсортировать его по возрастанию синусов этих чисел.

    Input:

    [.1,1,2,3,4,5,6,7,8,9,10]
    Output:

    [5, 4, 10, 6, 0.1, 3, 9, 7, 1, 2, 8]
    • Кому не лень, попробуйте сделать решение в две строки (понадобится немного Python-читерства) или даже в одну (вот тут побольше :) )

  1. EJudge: LinearLab 'Линейный Лабиринт'

    Лабиринт задан списком целых чисел A. Правила обхода следующие: находясь над ячейкой № k, путешественник может передвинуться на A[k] ячеек вперёд или на одну ячейку назад, если это позволяют границы списка. Ввести список и вывести YES, если из A[0] можно таки образом попасть в A[-1], и NO, если нельзя.

    Input:

    [1,2,6,2,8,2,10,2,11,2,13,2]
    Output:

    YES
  2. EJudge: SpiralDigits 'Цифры по спирали'

    Ввести целые M и N, вывести последовательность 0 1 2 3 4 5 6 7 8 9 0 1 2 3 … в виде спирально (по часовой стрелке, из верхнего левого угла) заполненной таблицы N×M (N строк, M столбцов). Не забываем про то, что M и N могут быть чётными, нечётными и неизвестно, какое больше.

    Input:

    6,5
    Output:

    0 1 2 3 4 5
    7 8 9 0 1 6
    6 7 8 9 2 7
    5 6 5 4 3 8
    4 3 2 1 0 9
  3. EJudge: LookSay 'Прочти это вслух'

    Input:

    for i,l in enumerate(LookSay()):
        print(f"{i}: {l}")
        if i>10:
            break
    Output:

    0: 1
    1: 1
    2: 1
    3: 2
    4: 1
    5: 1
    6: 2
    7: 1
    8: 1
    9: 1
    10: 1
    11: 1

LecturesCMC/PythonIntro2018/05_Lists (last edited 2018-10-21 17:53:51 by FrBrGeorge)