通过递归生成元素列表

Generate list of elements by recursion

我有以下递归关系 H(n) = 2*H(n-1) + 1, H(1) = 1。 如果我要在 python 中创建一个递归函数,这看起来会怎样? 我尝试了以下方法,但它似乎不起作用

def rec_func(N, n=0, H=[])
    if n == 1:
        return [1] + H
    else:

        return rec_fun(N-1, n+1, H)

我可能完全偏离了,但任何提示都将不胜感激。它应该是 return 元素列表 [H(1), H(2),...H(N)]

请注意,构造函数中的 n=0, H=[] 是必需的。这是我教科书中的练习 "Numerical Analysis"

试试这个:

# h(n) = 2 * h(n - 1) + 1
# h(1) = 1

def get_h_series(n):
    if n == 1:
        # h(1) = 1
        return [1]
    else:
        # ans = [h(0), h(1), ..., h(n - 1)]
        ans = get_h_series(n-1)
        # Append h(n) which is 2 * h(n - 1) + 1.
        ans.append(2 * ans[-1] + 1)
        # [h(0), h(1), ..., h(n - 1), h(n)]
        return ans

print(get_h_series(5))

输出:

[1, 3, 7, 15, 31]

如果你想做一个递归函数就这样做:

def H(n):
    if n == 1:
        return 1
    else:
        return 2*H(n-1)+1

如果你希望输出是一个列表,你必须做类似的事情:

def H_with_list(n, list_final):
    if n == 1:
        list_final.append(1)
        return list_final
    else:
        list_temp = H_with_list(n-1, list_final)
        list_final.append(2*list_temp[-1]+1)
        return list_final

小心递归函数很耗时,你应该计算H(n)并用一行代码让它工作

像这样:

def rec_func(n=1, H=[]):
    if not H:
        H = [None] * (n+1)

    if n == 1:
        H[n] = 1
    else:
        H =  rec_func(n-1, H)
        H[n] = 2 * H[n-1] + 1

    return H 

H = rec_func(3)

print(H) // prints -> [None, 1, 3, 7]

虽然其他答案会按照您的要求递归解决此问题,但值得一提的是,使用迭代解决此问题并不太难或很难看。如果您想使用较大的 n 值,您的代码可能会因 RuntimeError maximum recursion depth exceeded in comparison 或堆栈溢出 (heh) 而失败。您可以通过迭代实现它来解决这个问题,例如:

def list_h_results(n):
    h_results = []
    for i in range(1, n+1):
        h_results.append(2 * h_results[-1] + 1)
    return h_results

我并不是说你的练习一定要这样做,但如果在实际代码中实现这种功能,这是一个值得考虑的问题。此类问题通常选择递归,因为它优雅且更容易理解,但我认为在这种情况下,迭代解决方案同样易于理解,并且避免了与深度递归相关的潜在问题。

这是另一种不需要像 temp[-1] 这样的查找的方法,因为计算是 运行

def main(n, a=1):
  if n<=1:
    return [a]
  else:
    return [a, *main(n-1, 2*a+1)]

print(main(10))
# [ 1, 3, 7, 15, 31, 63, 127, 511, 1023 ]

print(main(1))
# [1]