2016-11-27 3 views
1

Я давно застрял в решении этого вопроса, я написал фрагмент кода, который работает в соответствии с запросом, но я, кажется, получаю сообщение об ошибке в конце компиляцииКак написать рекурсивную функцию в python

Вы должны разработать итеративный и рекурсивный функция называется replicate_iter и replicate_recur соответственно, которые будут получать два аргумента: раз, что является количество повторов и данных, которые это число или строка должна быть повторена.

Функция должна возвращать массив, содержащий повторения данных аргумента . Например, replicate_recur (3, 5) или replicate_iter (3,5) должен вернуть [5,5,5]. Если аргумент times отрицателен или равен нулю, возвращает пустой массив. Если аргумент недействителен, поднимите значение ValueError.

мой код, как показано ниже:

def replicate_iter(times,data): 

    emptyArray = [] 
    if not isinstance(data, int) and not isinstance(data, str): 
     raise ValueError 
    if times <= 0: 
     print emptyArray 
    if not isinstance(times,int): 
     raise ValueError 
    else: 
     while times > 0: 
      emptyArray.append(data) 
      times -= 1 
     return emptyArray 

array = [] 

def replicate_recur(times,data): 

    if not isinstance(data,int) and not isinstance(data,str): 
     raise ValueError 
    if not isinstance(times,int): 
     raise ValueError 
    if times <= 0 and len(array) != 0: 
     return array 
    elif times <= 0 and len(array) <=0: 
     return [] 
    else: 
     array.append(data) 
     replicate_recur(times - 1,data) 

Просьба помочь с предложениями, пожалуйста,

сообщение об ошибке: enter image description here

+1

Положите свою трассировку ошибок как код, а не изображение. –

+0

Спасибо. Сделал бы. Новинка к этому – MrTerfa

+0

Нет пота. Просто отредактируйте свой вопрос, чтобы содержать сообщение об ошибке как текст, а не как изображение, чтобы его можно было найти при поиске. –

ответ

0

Может быть, это то, что вы хотите на примере вы дали:

array = [] 
def replicate_recur(times, val): 
    if(isinstance(times, int) and times > 0): 
     array.append(val) 
     return replicate_recur(times-1, val) 
    return array 
print(replicate_recur(3, 5)) # [5,5,5] 



array = [] 
def replicate_iter(times, val): 
    if(isinstance(times, int) and times > 0): 
     for i in range(times): 
      array.append(val) 
     return array 
    raise ValueError 
print(replicate_iter(3, 5)) #[5,5,5] 
0

Нельзя использовать глобальную переменную. Второй вызов вашей функции приводит к неправильным результатам. Вместо этого используйте внутреннюю функцию или необязательный параметр.

def replicate_recur(times,data, array=None): 
    if array is None: 
     array = [] 
    if times <= 0: 
     return array 
    array.append(data) 
    return replicate_recur(times - 1, data, array) 
0

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

def rep_rec(times, data, pack=[]): 
    pack += [data] 
    return pack if times < 2 else rep_rec(times-1, data, pack) 


def replicate_recur(times, data): 
    if not times or not data: 
     return [] 
    if isinstance(times, int) and (isinstance(data, int) or isinstance(data, str)): 
     return rep_rec(times, data) if times > 0 else [] 
    raise ValueError 
1

Во-первых, подумайте об этом:

def f(times,data): 
    return [] if times == 0 else f(times - 1,data) + [data] 

print(f(3,5)) # [5,5,5] 

Теперь, что касается вашего рекурсивного решения, (1) для того, чтобы получить доступ к array, replicate_recur потребуется заявление в его начале, "global array, «поскольку переменная, array, объявлена ​​вне области действия; и (2) изменить рекурсивный вызов «replicate_recur(times - 1,data)» на «return replicate_recur(times - 1,data)», чтобы функция действительно возвращала значение, когда times больше нуля. (При этом, как я понимаю, обычно считается нежелательной формой глобальных аккумуляторов для рекурсивных функций.)

+0

Благодарим вас за объяснение. Это сработало для меня. Не могли бы вы любезно объяснить, как работает линия: возвращение replicate_recur (раз - 1, данные) + [данные] Защиту replicate_recur (раз, данные): если не isinstance (данные, INT) и не isinstance (данные, ул): поднять ValueError если не isinstance (раз, целый): поднять ValueError если раз <= 0: возвращение [] еще: возвращение replicate_recur (раз - 1, данные) + [данные] – MrTerfa

+0

@MrTerfa в отношении однострочного, подумайте, что вернет 'f (times-1, data)', если 'times' были' 1'. Теперь подумайте, что бы вернуть значение '+ [data]'? Тогда подумайте, что, если бы у нас было три таких звонка подряд? –

+0

@MrTerfa Что касается модификации исходной рекурсии, когда вы сначала вызываете функцию с 'times' больше 0, функция не должна возвращать что-либо. Он делает другой вызов той же функции, которая изменяет внешний 'массив', но просто ничего не возвращает. Когда мы, наконец, перейдем к строке 'return array', возврат не будет отправлен на исходный вызов, так как запроса на него не было. Префикс рекурсивного вызова с помощью 'return' означает, что мы ожидаем вернуть значение из рекурсивного вызова, который, когда мы получаем' return array', распространяется через предыдущие вызовы. –

0


""" 
A. In recursions, in general, some input is minimized until some minimum condition. 
    "eg: in f(x-2), x is the input" 



B. In the following recursion, multiples of x "eg: x TIMES f(x-2)" are 
    computed as x gets smaller and smaller by 2 "eg: f(x MINUS 2)", 
    until x finally reaches 1 "eg: if x==ONE return 1", the minimum CONDITION value. 



C. The recursion multiplies by many values generated by calls of function "f", 
    until mininum is reached. 
    "eg: x TIMES value-AT-f-CALL_a(x-2) TIMES value-AT-f-CALL_b(x-2).... 



D. When mininum CONDITION is reached, or in other words, when x reaches 1, the recursion 
    multiplies by 1, instead of another value generated by function "f" call. 
    "eg: x TIMES value-AT-f-CALL_a(x-2) TIMES value-AT-f-CALL_b(x-2) TIMES 1" 

    NOTE: This is why the recursion ends, as it no longer multiplies by value at f-call. 



E. In "TIMES 1" in D above, because 1 is the minimum RETURN value 
    "eg: if x==1: return ONE", this means the minimum CONDITION is reached. 

    NOTE: if we had x PLUS f(x-2), then the mininum value would be 
    ADDED TO (instead of multiplied by) the SUM (instead of the product). 
""" 

def f(x): 
    """This is a recursive function f to generate product of x, as x decreases by 2""" 
    if x == 1: 
     return 1 
    else: 
     return (x * f(x-2)) 
Смежные вопросы