如何写2 ** n-1作为递归函数?

Kaj*_*ice 49 python recursion

我需要一个接受n并返回2 n -1的函数。听起来很简单,但是该函数必须是递归的。到目前为止,我只有2 n

def required_steps(n):
    if n == 0:
        return 1
    return 2 * req_steps(n-1)
Run Code Online (Sandbox Code Playgroud)

练习指出:“您可以假设参数n始终为正整数且大于0”

h4z*_*4z3 54

2**n -1也是1 + 2 + 4 + ... + 2 n-1,可以将其设为单个递归函数(没有第二个递归函数需要从2的幂中减去1)。

提示:1 + 2 *(1 + 2 *(...))

下面的解决方案,不要看是否要先尝试提示。


如果n保证大于零(如问题声明中实际承诺的那样),则此方法有效:

def required_steps(n):
    if n == 1: # changed because we need one less going down
        return 1
    return 1 + 2 * required_steps(n-1)
Run Code Online (Sandbox Code Playgroud)

一个更强大的版本也将处理零和负值:

def required_steps(n):
    if n < 0:
        raise ValueError("n must be non-negative")
    if n == 0:
        return 0
    return 1 + 2 * required_steps(n-1)
Run Code Online (Sandbox Code Playgroud)

(剩下的是对非整数的检查作为练习。)

  • @ user633183是的,我知道总功能是什么。你呢?因为它永远不会是一个全部功能。其他答案也不是全部功能。是的,将需要更多代码才能使它们具有全部功能。-正如我所说,我们没有域名。我们应该假设我们的域名是什么?即使只是int,当n &lt;0时我们也不知道该怎么办。计算?抛出错误?返回0?在这种情况下,我们只能执行部分函数(将其定义为我们知道结果是什么的函数)。 (9认同)
  • `2 ^ 0-1` ==0。为这种情况添加另一个`if`。 (7认同)
  • 但是`required_steps(0)`现在会导致无限递归 (4认同)
  • OP的代码中的基本情况是“ 0”,并且对子问题使用“ n-1”。[自然数](https://en.m.wikipedia.org/wiki/Natural_number)的域似乎很合适。 (4认同)
  • 非常感谢!以我的拙见,这是针对我的特定问题的最佳解决方案。我没有说明n的可能值,真的很抱歉!我知道这很重要...练习指出:“您可以假设参数n始终为正整数且大于0” (4认同)
  • 我们没有得到n的任何可能值,所以我做了尽可能少的更改。我还可以添加递归负数,但是为什么呢?无论如何,您都应该始终测试从SO和其他来源获取的代码,因此您应该随后添加所需的任何边缘情况。 (2认同)

blh*_*ing 36

要使用递归方法解决问题,您将必须找出如何根据给定输入的功能定义相同输入和不同输入的功能。在这种情况下,由于f(n) = 2 * f(n - 1) + 1,您可以执行以下操作:

def required_steps(n):
    return n and 2 * required_steps(n - 1) + 1
Run Code Online (Sandbox Code Playgroud)

以便:

for i in range(5):
    print(required_steps(i))
Run Code Online (Sandbox Code Playgroud)

输出:

0
1
3
7
15
Run Code Online (Sandbox Code Playgroud)


raf*_*elc 9

您可以将真正的递归部分提取到另一个函数中

def f(n):
    return required_steps(n) - 1
Run Code Online (Sandbox Code Playgroud)

或者您可以设置一个标志并定义何时减去

def required_steps(n, sub=True):
    if n == 0: return 1
    return 2 * required_steps(n-1, False) - sub
Run Code Online (Sandbox Code Playgroud)
>>> print(required_steps(10))
1023
Run Code Online (Sandbox Code Playgroud)