使递归函数更优雅
Making recursive function more elegant
我一直在努力磨练我对递归的理解[并成为一个更好的程序员]。今天写了一些代码来扁平化一个元组的元组。代码如下:
def recursive_tuple_flatten(tuple_list):
if type(tuple_list) is tuple:
if type(tuple_list[0]) is tuple:
list_of_lists = [list(tuple_list[0]), tuple_list[1:]]
return recursive_tuple_flatten([i for j in list_of_lists for i in j])
else:
return recursive_tuple_flatten(list(tuple_list))
else:
if type(tuple_list[-1]) is tuple:
list_of_lists = [tuple_list[:-1], list(tuple_list[-1])]
return recursive_tuple_flatten([i for j in list_of_lists for i in j])
else:
return tuple_list
k = ((1,(2)),(3,(4,5)))
recursive_tuple_flatten(k)
代码有效,但我非常感谢任何帮助我改进此代码并使其更优雅的建议和指导。祝你有美好的一天!
分而治之是提出递归算法时的常用技术。在您的示例提示中,该函数应该只遍历列表中的所有值,并使用 slight 更小的数组大小调用自身。最终它将达到 0 的大小(单个值),您就完成了。
好久没写Python代码了。假设这是关于递归算法的一般问题,这将是它在 JavaScript 中的样子(应该是不言自明的 - 将其视为伪代码):
function flatten(arr) {
if (!Array.isArray(arr)) return [arr];
return arr.reduce((acc, cur) => [...acc, ...flatten(cur)], []);
}
const input = [[1,[2]],[3,[4,5]]];
const output = flatten([[1,[2]],[3,[4,5]]]);
console.log(output);
如果您需要 Python 中的可靠示例,请告诉我。
这些步骤可能会帮助您找到问题的优雅递归解决方案:
- 找到减少输入大小的方法
n
。通过归纳,您可以假设您的功能已经为 n - 1
实现
- 弄清楚如何将较小输入大小的结果组合在一起。这是 "divide and conquer" 部分。
- 确定基本情况。您的递归函数需要在某个时刻停止。
虽然这可能属于代码审查,但这是我想出的,为此:
def recursive_tuple_flatten(tuples):
res = []
for elem in tuples:
if isinstance(elem, tuple):
res.extend(recursive_tuple_flatten(elem))
else:
res.append(elem)
return res
我一直在努力磨练我对递归的理解[并成为一个更好的程序员]。今天写了一些代码来扁平化一个元组的元组。代码如下:
def recursive_tuple_flatten(tuple_list):
if type(tuple_list) is tuple:
if type(tuple_list[0]) is tuple:
list_of_lists = [list(tuple_list[0]), tuple_list[1:]]
return recursive_tuple_flatten([i for j in list_of_lists for i in j])
else:
return recursive_tuple_flatten(list(tuple_list))
else:
if type(tuple_list[-1]) is tuple:
list_of_lists = [tuple_list[:-1], list(tuple_list[-1])]
return recursive_tuple_flatten([i for j in list_of_lists for i in j])
else:
return tuple_list
k = ((1,(2)),(3,(4,5)))
recursive_tuple_flatten(k)
代码有效,但我非常感谢任何帮助我改进此代码并使其更优雅的建议和指导。祝你有美好的一天!
分而治之是提出递归算法时的常用技术。在您的示例提示中,该函数应该只遍历列表中的所有值,并使用 slight 更小的数组大小调用自身。最终它将达到 0 的大小(单个值),您就完成了。
好久没写Python代码了。假设这是关于递归算法的一般问题,这将是它在 JavaScript 中的样子(应该是不言自明的 - 将其视为伪代码):
function flatten(arr) {
if (!Array.isArray(arr)) return [arr];
return arr.reduce((acc, cur) => [...acc, ...flatten(cur)], []);
}
const input = [[1,[2]],[3,[4,5]]];
const output = flatten([[1,[2]],[3,[4,5]]]);
console.log(output);
如果您需要 Python 中的可靠示例,请告诉我。
这些步骤可能会帮助您找到问题的优雅递归解决方案:
- 找到减少输入大小的方法
n
。通过归纳,您可以假设您的功能已经为n - 1
实现
- 弄清楚如何将较小输入大小的结果组合在一起。这是 "divide and conquer" 部分。
- 确定基本情况。您的递归函数需要在某个时刻停止。
虽然这可能属于代码审查,但这是我想出的,为此:
def recursive_tuple_flatten(tuples):
res = []
for elem in tuples:
if isinstance(elem, tuple):
res.extend(recursive_tuple_flatten(elem))
else:
res.append(elem)
return res