2015-03-25 3 views
1

Я хочу построить функцию, которая принимает два натуральных числа n и m и возвращает кортеж квадратов всех натуральных чисел, начиная с n и заканчивая m-1. Я могу решить, должна ли функция возвращаться, если m меньше n, но она не должна сбой или возврат какого-либо сообщения об ошибке. Итак, squares_tuple (3,7) возвращает (9,16,25,36) и rec_range (10,11) возвращает (100,). Кроме того, я не хочу использовать диапазоны(), map(), циклы или списки. Вот то, что я до сих пор:Рекурсивные функции с математическими операторами

def squares_tuple(n,m): 
"""takes two nat nums n and m and returns a tuple of the squares of all the 
natural numbers starting with n and ending with m-1 

nat, nat -> tuple of natural numbers""" 
    if m >= 0: 
     return 0 
    else: 
     return squares_tuple(n - 1,) + (n**m,) 

Вид застрял в этой точке ...

+1

Какая ошибка? – pjc

+1

Не хотите, чтобы это было 'if m <= 0:'? – jcfollower

ответ

4
def squares_tuple(n, m): 
    return (n * n,) + squares_tuple(n + 1, m) if n < m else() 

Пример:

>>> squares_tuple(0, 6) 
(0, 1, 4, 9, 16, 25) 
>>> squares_tuple(3, 7) 
(9, 16, 25, 36) 
+0

@AdamSmith Вы не можете добавить список в кортеж, чтобы не использовать тип возвращаемого значения для кортежа. – Shashank

+0

@Shashank Бах, ты прав. Я ужасен с рекурсивными функциями. Удалил мой комментарий. –

1

ли это должно быть рекурсивной функции? Если нет, то лучшим решением является:

def squares_tuple(start, stop): 
    return tuple([num**2 for num in range(start, stop)]) 
+0

На самом деле вам не нужно создавать временный список: 'return tuple (num ** 2 для num in range (start, stop))'. [_since python 2.4_] (https://www.python.org/dev/peps/pep-0289/) –

+1

@BillLynch Я не профилировал, но в некоторых из тех видов «построения из завершенного списка», функции с использованием списка comp на самом деле быстрее. см. комментарии к [этому ответу] (http://stackoverflow.com/a/9060697/3058609) –

+0

@AdamSmith Посмотрите мой тест здесь: http://repl.it/f2h Добавление кортежей выполнимо в меньшей сумме времени. Обратите внимание, что я создал как списки, так и кортежи на этапе настройки, поэтому я тестирую только время добавления оператора. (Создание кортежей также быстрее, чем создание списков) – Shashank

Смежные вопросы