Как создать рекурсивную функцию пирамиды?

#python #recursion

#python #рекурсия

Вопрос:

Мне действительно нужно создать две рекурсивные функции в Python. первая функция должна создать пирамиду с заданным параметром n . например pyramid(3) , должен иметь следующий вывод

   *
 ***
*****
 

Я придумал следующую функцию:

 def pyramid(n, i=0):
    if n == 0:
        return 0
    else:
        print(" "*(n-1)  "*"*(2*i 1)  " "*(n-1))
        return pyramid(n-1, i 1)
 

Теперь мне нужно создать вторую рекурсивную функцию pyramid_seq с 2 параметрами n,k , которая выводит последовательность пирамид высотой n . например pyramid_seq(3,4) , должен иметь следующий вывод:

   *    *    *    *
 ***  ***  ***  ***
********************
 

Ответ №1:

Добавьте в свою функцию еще один параметр (обратите внимание на изменения в рекурсивном вызове), который определяет, сколько раз вы должны печатать каждую строку. Это создаст желаемый эффект.

 def pyramid(n, k, i=0):

    if n == 0:
        return 0

    else:
        print(k*(" "*(n-1)  "*"*(2*i 1)  " "*(n-1)))
        return pyramid(n-1, k, i 1)
 

Вывод для pyramid(4, 6) :

    *      *      *      *      *      *   
  ***    ***    ***    ***    ***    ***  
 *****  *****  *****  *****  *****  ***** 
******************************************
 

Комментарии:

1. Мне было интересно, как мы могли бы добиться одинаковой последовательности пирамид с разной высотой?

2. @alamshahbaz16497 вы имеете в виду пирамиду с (например) 5 уровнями? Если это то, что вы имели в виду, то все, что вам нужно сделать, это изменить параметр ‘n’, который определяет, сколько уровней будет иметь каждая пирамида. Если вы имели в виду что-то другое, пожалуйста, уточните, потому что я вас не понял

3. Нет, я имел в виду, как мы печатаем пирамиды с разной высотой в последовательности. Пример: пирамида (2, 3, 5, 8) таким образом, первая пирамида будет иметь высоту 2, тогда вторая будет иметь высоту 3 и так далее.

4. @alamshahbaz16497 Я думаю, что рекурсивное решение не является подходящим решением вашей проблемы, но, конечно, оно может быть принудительным

Ответ №2:

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

 def pyramid(h):
    if h==1: return ["*"]
    return [" " p " " for p in pyramid(h-1)] ["*"*(2*h-1)]
 

Функция возвращает массив строк (strings), которые вы можете распечатать или использовать повторно для чего-то другого:

 print(*pyramid(5),sep="n")

    *    
   ***   
  *****  
 ******* 
*********
 

Поскольку теперь у вас есть функция, которая генерирует пирамиду в виде списка строк, вы можете повторно использовать ее, чтобы объединить ее результат, чтобы сформировать серию пирамид, не изобретая велосипед:

 def pyramids(h,w):
    return [p*w for p in pyramid(h)]


print(*pyramids(4,6),sep="n")

   *      *      *      *      *      *   
  ***    ***    ***    ***    ***    ***  
 *****  *****  *****  *****  *****  ***** 
******************************************
 

Если ваша вторая функция также должна быть рекурсивной, вы все равно можете повторно использовать первую для ее создания:

 def pyramids(h,w):
    if w == 1: return pyramid(h)
    return [ ps p for ps,p in zip(pyramids(h,w-1),pyramid(h)) ]