使递归函数更优雅

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 中的可靠示例,请告诉我。

这些步骤可能会帮助您找到问题的优雅递归解决方案:

  1. 找到减少输入大小的方法n。通过归纳,您可以假设您的功能已经为 n - 1
  2. 实现
  3. 弄清楚如何将较小输入大小的结果组合在一起。这是 "divide and conquer" 部分。
  4. 确定基本情况。您的递归函数需要在某个时刻停止。

虽然这可能属于代码审查,但这是我想出的,为此:

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