Цикл номеров вниз и вверх и не использовать рекурсию в Python - PullRequest
0 голосов
/ 14 сентября 2018

У меня небольшая проблема с моим кодом.Я не могу понять, как это сделать.Я могу заставить его работать с двумя циклами.Но в упражнении говорится, что я могу использовать только один цикл, чтобы получить результат.Код должен выполнить это:

bounce2 (4):

  • 4
  • 3
  • 2
  • 1
  • 0
  • 1
  • 2
  • 3
  • 4

Что я придумал:

def bounce2(n):
    for x in range(n,-1,-1):
    print(x)

Который печатает 4,3,2,1,0 Но теперь я не знаю, что делать .. Я пробовал разные выражения, такие как:

def bounce2(n):
   for x in range(n,-1,-1):
   print(x)
   if n == 0:
   x = x + 1
   print(x)

Но они печатают только одно целое число, потому что они вне цикла.То же самое происходит, если я пытаюсь сделать оператор if внутри цикла, тогда он печатает что-то вроде 433221100. Я не знаю, как заставить числа поменяться местами.Оператор печати также должен быть целым числом, а не строкой.Так что я не могу использовать замену.

Действительно нужна помощь, чтобы выяснить логику.Вся помощь приветствуется.

Ответы [ 5 ]

0 голосов
/ 14 сентября 2018

Вот что я считаю довольно элегантным решением:

def bounce(n):
    for x in range(-n, n+1):
        print(abs(x))

Наш цикл идет от отрицательного значения n к положительному значению n, выводя абсолютное значение.

0 голосов
/ 14 сентября 2018

очень простое решение будет:

for i in range(n, -(n+1), -1):
    print(abs(i))

это похоже на отражение чисел вокруг некоторой точки.
в вашем случае эта точка равна нулю и для идентичного зеркалирования используйте abs

0 голосов
/ 14 сентября 2018

Так как вам нужно считать n раз вниз, и еще n раз вверх, а 1 происходит от подсчета 0, вместо фактического подсчета вниз, а затем вверх в двух отдельных циклах, мы можем использовать один Цикл для подсчета вверх 2 * n + 1 раз, что по сути равносильно подсчету до n и затем отскочив от n, поэтому мы можем просто вычислить «расстояние» до n вместо этого, что является абсолютным значением n - x :

def bounce2(n):
    for x in range(2 * n + 1):
        print(abs(n - x))

так что bounce2(4) выведет:

4
3
2
1
0
1
2
3
4
0 голосов
/ 14 сентября 2018

Итак, немного моего мыслительного процесса, прежде чем показывать вам код.Очевидно, что есть девять строк, или, в общем, n * 2 + 1 строк.Потому что мы должны считать до 0 и обратно.Вот сколько раз вам нужно вызывать print.

Теперь, если вы добавите номера строк к ожидаемому результату и будете рассматривать его как таблицу, описывающую функцию f(i, n), где i - номер строки, иn - начальное и конечное значение.что такое f?Вы можете записать формулу?Например,

i f(i, 4)
0  4
1  3
2  2
3  1
4  0
5  1
6  2
7  3
8  4

Мы можем записать базовую структуру кода, мы до сих пор не знаем, как выглядит f, но предположим, что она у нас есть:

for i in range(2*n+1):
    print f(i)

И,что такое f?Теперь вам нужно быть немного креативным и, возможно, немного поэкспериментировать.Я попытался использовать простые арифметические комбинации i и n для соответствия f(i, n), и я быстро заметил, что n - i работает, пока мы не достигнем второй половины результата, которая отличается только на -знак.

i f(i, 4) n - i
0  4       4
1  3       3
2  2       2
3  1       1
4  0       0
5  1       -1
6  2       -2
7  3       -3
8  4       -4

Тааак, возьмите абсолютное значение n - i или i - n, что угодно.

def f(i, n):
    return abs(n-i)
0 голосов
/ 14 сентября 2018

Попробуйте ниже, у вас есть список l с элементом str(n) итерации по диапазону n умножить на 2, затем проверьте, что x больше n+2, если добавить 1 к n, иначе вычтите 1 из n, оба случая добавьте к l, затем в конце сделайте str.join, чтобы объединить '\n' (перевод строки) с l:

def bounce2(n):
   l=[str(n)]
   for x in range(n*2):
      if x>n+2:
         n+=1
         l.append(str(n))         
      else:
         n-=1
         l.append(str(n))
   return '\n'.join(l)
print(bounce2(4))

Вывод:

4
3
2
1
0
1
2
3
4
...