2015-03-26 6 views
0

Я пытаюсь написать две функции, которые принимают целое число и возвращают кортеж. Я могу приблизиться к тому, что хотел бы вернуться, но то, что я возвращаю, содержит в себе несколько круглых скобок. например, я хочу, чтобы rec_range (5) возвращал (0,1,2,3,4) вместо ((((0, 1), 2), 3), 4).Рекурсия и кортежи в Python

две функции я пишу

def rec_range(n): 
    '''Takes a natural number n and returns a tuple of numbers starting 
     with 0 and ending before n. 
     Int-->Tuple''' 

    if n == 0: 
     return 
    if n == 1: 
     return 0 
    if n >= 1: 
     return rec_range(n-1),(n-1) 

def squares_tuple(n,m): 
    '''Takes a natural numbers n and m and returns a tuple of the squares 
     of all the natural numbers starting with n and ending with m-1. 
     Int,Int-->Tuple''' 

    while n<=m: 
     return n * n, squares_tuple(n + 1, m) 
+0

Кроме того, я не хочу использовать диапазоны(), map(), циклы или списки. – Brett

+0

да, но я хотел бы знать, почему я получаю то, что получаю. – Brett

+0

Это не очень хороший вариант для рекурсии – wim

ответ

1

два вопроса: во-первых, вам нужно вернуть кортеж, а не междунар, для базового варианта:

if n == 1: 
    return (0,) 

Во-вторых, вам нужно добавить n - 1 к кортеж, а не возвращать его в виде пары с кортежем:

if n >= 1: 
    return rec_range(n-1) + (n-1,) 

Ваш squares_tuple можно решить аналогичным образом. Обратите внимание, что я изменил базовый регистр, чтобы вернуть пустой кортеж, а не None. (Я также изменил while на if, что делает его немного понятнее, поскольку это происходит только один раз).

if n<=m: 
    return (n * n,) + squares_tuple(n + 1, m) 
return() 
2

Это потому, что вы используете возвращаемое значение из ваших рекурсивных вызовов в качестве отдельного элемента в новом кортеже, а не строить кортеж из элементов возвращаемого значения плюс новые элементы.

Вместо этого, вы, вероятно, следует добавлять кортежи вместе:

return rec_range(n-1) + (n-1,) 

и

return (n*n,) + squares_tuple(n+1, m) 

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

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