将double for循环转换为递归函数

时间:2019-01-04 08:27:44

标签: arrays python-3.x numpy for-loop recursion

我处理两个3D数组,第二个arr会根据第一个arr进行更改。

我尝试将for循环的double转换为递归函数,但重复相同的错误, 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

递归

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 :(得分:1)

虽然这不能回答您有关递归深度的问题,但我认为解决方案非常简单。似乎您想通过遍历图像中的所有像素,然后操纵像素值来反转图像(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 array中时,您可以对矩阵进行标量算术(加法,乘法等)。这样,您就不必执行嵌套循环(或递归操作)。

答案 1 :(得分:0)

搜索词RecursionError: maximum recursion depth exceeded的答案很丰富-原因很简单:

  • 您尝试重新使用,但您的功能/数据不允许使用:
    • 数据太大,因此您需要递归max_depth + n次才能解决
    • 您的数据(或方法)将永远不会达到递归的结束条件
    • 您的功能没有结束条件

您的递归是有缺陷的,而且您永远也无法到达终点-因此,您会越来越深入,将调用堆栈放到调用堆栈上,直到python引发错误为止,以避免由于成千上万的函数调用而从累积堆栈帧中产生Stackoverflow。

例如:

# 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)

无论如何..您需要修复您的功能。最好的方法是取一个小的数据样本,一支笔和一张纸,然后绘制/计算该函数的功能,以查看其为何不断循环。