Mary Louse Ответов: 4

Нужна помощь в печати номерной последовательности с помощью рекурсивной функции


Given a positive integer 'n' and another positive integer k where k<n, I need to print the following pattern using recursion.

Example:
Input 1: n = 12, k = 5
Output 2: 12, 7, 2, -3, 2, 7, 12

Input 2: n = 10, k =2
Output 2: 10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10

Basically, I need to keep decrementing the given value of 'n' by 'k' until you encounter 0 or a negative number, in which case, I need to start incrementing by 'k' until you reach 'n' again. I need to implement this using recursion function. Can anyone help me with solution please? I'm not getting the logic and also I'm unable to remove the "," after the last number<pre>

What I have tried:

<pre># Reading inputs
n = int(input())
k = int(input())

# Function

def pattern(n):
    
    if n<0:
        return n
    else:
        print(n, end=", ")
        pattern(n-k)
        print(n,end=", ")
    
pattern(n)  

4 Ответов

Рейтинг:
2

Member 14926458

# Чтение входных данных
n = int(вход())
k = int(вход())

# Определите функцию
def pattern(n, m, k):

# Базовый вариант. Если m <= 0, выведите m и вернитесь из функции
если m <= 0:
print(m, end = ", ")
вернуть

# Print m, вызовите рекурсивную функцию с помощью (n, m-k, k), а затем снова выведите m
print(m, end = ", ")
паттерн(n, m-k, k)
# Этот условный оператор был использован для того, чтобы вы не печатали запятую
# после последнего элемента.
если(n != m):
print(m, end = ", ")
еще:
печать(м)

# Объявление другой переменной m равной n
m = n

# Вызов функции с 3 аргументами - n, m и k. Будет использована дополнительная буква М
# для рекурсивных вызовов. N будет сохранено, потому что если вы проверите выход
# format, вы увидите, что после последнего элемента вы не должны печатать запятую.
# Значение 'n' в функции будет использоваться в первую очередь для этого.
паттерн(n, m, k)


Рейтинг:
2

Member 14869258

Всем Привет,

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

def pattern(n):

если n<=0: # тест должен включать 0
print(n, end= ")
еще:
print(n, end= ")
print(", ", end= ")
паттерн(n-k)
print(", ", end= ")
print(n, end= ")

Выход:

Выход решения
10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10None
Ожидаемый результат
10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10


0x01AA

Нейтральная 3, другие дадут легко 1 для этого. Вы не прочитали все комментарии?

CHill60

Или кто-то из нас сообщит об этом как о "не ответе" :-)

0x01AA

:-)

Рейтинг:
1

Patrice T

Свой подход:

def pattern(n):
    
    if n<0: # test must include 0
        return n # Where have you seen that pattern return something ?
        print(n)
    else:
        print(n)
        print(", ")
        pattern(n-k)
        print(", ")
        print(n)


0x01AA

Я предполагаю, что вы проверили его, и он работает. Итак, а +5
Это действительно работает?

Вау да, только что протестировано онлайн :thumbsup:

Только одна небольшая поправка: if n<=0: как вы упомянули об этом :-)

Patrice T

Спасибо.
На самом деле, я его не проверял :)
Сделал это, просто прочитав код .

0x01AA

Спасибо! И я до сих пор не могу понять, как это происходит с этим примером :blush:. Рекурсивные вещи никогда не были моим коньком, но из-за вашего решения я погружусь в него и попытаюсь понять этот пример :-)

Patrice T

Рекурсия нуждается в небольшом повороте мышления.
Самый простой способ-это, вероятно, атаковать проблему в обратном направлении.
Допустим,у вас есть паттерн(n, k)

pattern(0,2) is 0
pattern(2,2) is 2, 0, 2 => n+", "+pattern(n-k,k)+", "+n
pattern(4,2) is 4, 2, 0, 2, 4 => n+", "+pattern(n-k,k)+", "+n
pattern(6,2) is 6, 4, 2, 0, 2, 4, 6 => n+", "+pattern(n-k,k)+", "+n

Mary Louse

Привет, спасибо за код, но он нуждается в некоторых изменениях.. это не дает правильного результата для следующего:
входные данные : n=10, k=2
фактический выход: 10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10
Выход раствора : 10
,
8
,
6
,
4
,
2
,
0
,
-2
,
0
,
2
,
4
,
6
,
8
,
10

не могли бы вы помочь мне с ответом?

Patrice T

Взгляните на параметры: Функция Python print() [^]

0x01AA

И вы обратили внимание на комментарий от Патрис здесьif n<0: # test must include 0?

0x01AA

Даже если я не должен этого делать ... но поскольку я надеюсь, что вы примете этот превосходный ответ от Патрисета и оцените его пятью звездами, окончательный код таков (отступы, которые вы должны восстановить самостоятельно):

def pattern(n):    
    if n<=0: 
        print(n, end= '')
    else:
        print(n, end= '')
        print(", ", end= '')
        pattern(n-k)
        print(", ", end= '')
        print(n, end= '')

Patrice T

Спасибо за поддержку
Я исправил ваш комментарий для представления кода.

0x01AA

Мы всегда рады вам. Как вы это сделали с пробелами/отступами?

Просто отредактируйте его и посмотрите, как он работает. Спасибо ;)

Patrice T

Когда я делаю комментарии с кодом, я строю комментарий в пустом решении, а затем вырезаю/вставляю в комментарий.

0x01AA

Я такой дурак, то же самое я делаю со ссылками, но никогда не думал о том, что это работает и с кодом :-)

Рейтинг:
1

OriginalGriff

Прочитайте инструкцию еще раз и подумайте о том, что вы должны сделать.
Я бы написал две функции: одну, чтобы идти "вниз", и одну, чтобы идти "вверх". Затем позовите их обоих, одного за другим.
Передайте ему три значения: текущее значение, декремент и "разделитель". В этом случае возвращаемое значение не требуется (как и рекурсия, это гораздо проще, чем цикл).
Первый раз, когда вы позвоните, передать его н и пустую строку.
в функции выведите разделитель, а затем текущее значение.
Теперь уменьшите текущее значение и проверьте его. Если он меньше нуля, возвращайтесь.
В противном случае вызовите функцию снова с новым текущим значением, тем же декрементом и разделителем ", ".

Функция "вверх" такая же, но идет в другую сторону.

Попробуйте сначала сделать это на бумаге вручную, и вы поймете, что я имею в виду, а затем начните кодировать.