Завершение функции, которая не должна ничего возвращать (Задача 169 на ACMP)

StackOverFlow. Я так много раз порывался написать свой первый вопрос, но всегда находил ответ. Если разместил что-то не туда или не так, прошу простить: не опытен, исправлюсь.

Задача:

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

На вход подаются через пробел два целых числа n – расстояние до магазина в шагах и k – требуемое количество шагов, которые должен сделать человек (1 ≤ n ≤ k ≤ 50).

На выход следует подать только одно число - количество способов попадания в магазин.

Имею функцию такого рода:

i = input().split()
shop = int(i[0])
count = int(i[1])
ans = 0

def p(c, shop):
    #print(c, shop)
    global ans
    if shop == c - 2:
        ans += shop
        #print('here')
        return None
    elif shop == 0:
        #print('no here')
        return 0
    else:
        return p(c-1, shop - 1), p(c-1, shop + 1)

a = p(count, shop)
print(ans)

Могу ли я не возврашать ничего каким-то более экономичным способом в плане количества операций, которые делает процессор? Дорогая ли операция возврата, может дешевле возвращать число или что-то другое? Функция разворачивается в огромные деревья, а уменя ограничение всего 1 секунда.

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

Я попытался найти ответ на свой вопрос здесь и в гугле, но максимум нашел вопрос по С, может ли функция не иметь return. Я знаю, что может, но мне нужен, некий аналог break, который тут не работает.

Большое вам спасибо.

UPD. Обновил вопрос, по просьбам в комментариях. UPD2. В финальной версии программы все вопросы уже и не актуальны. Первый блин комом.


Ответы (1 шт):

Автор решения: Vladimir Doronin

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

i = input().split()
shop = int(i[0])
count = int(i[1])
memory = []
for _ in range(count):
    memory.append([0]* (count))
def p(count, shop):
    if count == shop:
        return 1
    if count == shop+2:
        return shop
    else:
        b = pp(count, shop)
        return b

def pp(count, shop):
    global memory
    #print(count, shop)
    if shop == 0 or shop > count:
        #print('here 0')
        return 0
    if memory[count-1][shop-1] == 0:

        if shop == count - 4:
            #print('here umn')
            s = int((shop+3) * (shop/2))
            memory[count-1][shop-1] = s
            return s
        else: 
            s = pp(count-1, shop+1) + pp(count-1, shop-1)
            memory[count-1][shop-1] = s
            return s
    else:
        return memory[count-1][shop-1] 
a = p(count, shop)
print(a)
#print(memory)
→ Ссылка