Конвертировать double for loop в рекурсивную функцию - PullRequest
0 голосов
/ 04 января 2019

Я работаю с двумя трехмерными массивами, для которых второе значение изменяется в зависимости от первого значения.

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

Циклы for, которые я пытаюсь преобразовать:

def to_rec(arr):
    new = arr.copy()
    row_max = len(arr) 
    col_max = len(arr[0])

    for  i in range(row_max):
        for j in range(col_max):
            new[i, j, :] = 255- arr[i, j, :]

    return new

RECURSIVE

def rec2(img, row_max, col_max, i, j, new):
if j == col_mac:
    return new
else:
    new[i, j, :] = 255 - img[i, j, :]
    return rec2(img, row_max, col_max, i, j+1, new)

****************************************************
def rec1(img, row_max, col_max, i, j, new):
    if i == row_max:
        return new
    else:
        rec2(img, row_max, col_max, i, j, new)
        return rec1(img, row_max, col_max, i+1, 0, new)

********************************************************
def to_rec(arr):
    ......
     # The same data as in to_rac func with the for loop
    ......
    new = rec1(arr, row_max, col_max, 0, 0, new)
    return new

Я не могу понять, что не так

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Поисковый термин RecursionError: maximum recursion depth exceeded имеет множество ответов на SO - причина проста:

  • вы пытаетесь отменить, но ваша функция / данные не позволяют этого:
    • данные слишком велики, так что вам придется повторять max_depth + n раз для их решения
    • ваши данные (или метод) никогда не достигнут конечного условия вашей рекурсии
    • ваша функция не имеет концаусловие

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

Пример:

# recurses crashes every time (no end condition)
def no_end_1(k = True):
     no_end_1(not k)

# recursion works if you call it with some data but not with other data
def no_end_2(i):
    if i == 0:
        return "Done"
    no_end_2(i-1)

no_end(25) # works
no_end(-3) # crashes

def flawed_collatz_testmethod(a):
    # collatz conjectur holds for numbers up to 
    #  2.361.183.346.958.000.000.001 (wikipedia), they converge on 1
    if a%2 == 0:
        new_a = a//2
    else:
        new_a = 3*a+1

    if new_a < 1:
        print ("Collatz was wrong")
    else:
        # will eventually end in a loop of 4-2-1-4-2-1-4-2-1-... and crash
        flawed_method(new_a)

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

0 голосов
/ 04 января 2019

Хотя это не отвечает на ваш вопрос о глубине рекурсии, я думаю, что решение довольно простое.Кажется, вы хотите инвертировать изображение (new[i, j, 0] = 255- arr[i, j, 0]), зацикливаясь на всех пикселях в изображении, а затем манипулируя значением пикселя.Это можно сделать очень эффективно, используя NumPy :

import numpy as np
img = load_img_data()  # Replace this by your own data
new_img = 255 - np.array(img)

Когда ваши данные хранятся в массиве NumPy , вы можете тривиально выполнять скалярную арифметику (сложение, умножениеи т. д.) на матрицах.Таким образом, вам не нужно выполнять вложенные циклы (или рекурсивные операции).

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