Рекурсия, вызов функции с использованием ввода - PullRequest
1 голос
/ 14 февраля 2011

Я работаю над некоторыми рекурсиями. Я создал некоторые функции в духе двенадцати дней Рождества, но я не могу придумать, как вызвать функцию, используя ввод. Я приведу пример:

def day1():
    print 'A Partridge in a Pear Tree'
def day2():
    print '2 Turtle Doves'
    day1()
def day3():
    print '3 French Hens'
    day2()

Я попытался пойти по пути использования операторов if внутри функции, такой как

def DaysOfXmas(n):
    if n == 1:
        day1()
    if n == 2:
        day2()
    if n == 3:
        day3()

Но это похоже на ужасный и грязный способ сделать это. Есть предложения?

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011
days = ['A Partridge in a Pear Tree',
        '2 Turtle Doves',
        '3 French Hens']

def sing(n=0):
    print days[n]
    try:
        sing(n+1)
    except IndexError:
        return

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

2 голосов
/ 14 февраля 2011

Ну, вы могли бы делать globals()['day%d' % n](), но это еще более ужасно и грязно.

Просто поместите функции в коллекцию. Например, список или диктовку, если вам нужны разреженные или нецелые ключи. day_funcs = [day0, day1, day, day3] (day0, вероятно, должен быть заполнителем, не вызываемый вызов работает, если вы проверяете ввод перед тем, как вслепую получить элемент и вызываете его - если нет, пользователь получает ужасную ошибку, которая кажется совершенно не связанной) * в диспетчере. Вы можете сделать это более СУХИМЫМ несколькими способами: тот, который требует последней типизации (но также не подходит для других схем именования), будет помещать функции (и только те) в отдельный модуль и, после их импорта, определив day_funcs = sorted(inspect.getmembers(the_module, isfunction)).

0 голосов
/ 14 февраля 2011

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

Если вы хотите сделать что-то другое для 12 входных значений, либо рассмотрите возможность использования карты выходных данных для данного ввода (затем снова вызовите функцию с уменьшенным входным значением), либо у вас есть 12 базовых вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...