我处理两个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
我不知道怎么了
答案 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
的答案很丰富-原因很简单:
您的递归是有缺陷的,而且您永远也无法到达终点-因此,您会越来越深入,将调用堆栈放到调用堆栈上,直到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)
无论如何..您需要修复您的功能。最好的方法是取一个小的数据样本,一支笔和一张纸,然后绘制/计算该函数的功能,以查看其为何不断循环。