使用递归的range(1,n,2)值的总和

时间:2019-07-19 12:27:29

标签: python recursion

我正在尝试将循环转换为递归算法。相当简单,我只是无法像范围一样使它们在对值求和时忽略n值。

这是迭代函数:

def function(n):
    total=0
    for i in range(1,n,2):
        total += i
    print(total)

function(5) # Output: 4

这是我尝试过的递归:

def function1(n):
    if n==1:
        return n
    else:
        return n+function1(n-2)
function(5) # Output: 9

因此,function1在应该忽略n时求和。原因range()不包含停止号。

然后,我尝试了:

def f1(n):
    def f_recursive(n):
        if n==1 or n==2:
            return 1
        elif n==0:
            return 0
        else:
            return n + f_recursive(n - 2)

    return f_recursive(n) - n 

print(f1(5)) # Output: 4 Yeiii!!

但是后来我意识到,这仅适用于奇数。不连。如果为f1(6),则在应为4的情况下得到9,因为它最终为11-6 = 9。

太傻了,我尝试过:

def f1(n):
    def f_recursive(n):
        if n==1 or n==2:
            return 1
        elif n==0:
            return 0
        elif n%2 == 0:
            return n + f_recursive(n - 3)

        elif n%2 == 1:
            return n + f_recursive(n - 2)

    return f_recursive(n) - n 

print(f1(6))

当然也没有用。我在这里不正确理解递归吗?

5 个答案:

答案 0 :(得分:2)

递归的问题是您返回的是n而不是当前所在范围(列表)中的值,这引起了问题,因为n不包含在内范围,不应添加到最终总数中

理想情况下,您需要以与范围相同的方式反转逻辑并遍历它

def func(start,end, step):
    if(start >= end):
        return 0

    return start + func(start + step, end, step)

答案 1 :(得分:2)

您要计算从1到n(但不包括n)的所有奇数整数之和。

这有2种可能性:

  1. 如果n为<= 1,则没有要求和的数字,所以总和为0。
  2. 列表中可能包含的 最高数字是n-1,但前提是它是奇数。无论哪种方式,其余的总和是“ 从1到n-1(但不包括n-1)的所有奇数整数的总和”(听起来很熟悉?)

这意味着:

def f1(n):
    if n <= 1:
        return 0
    else:
        isOdd = (n-1)%2==1
        return f1(n-1) + (n-1 if isOdd else 0)

答案 2 :(得分:2)

棘手的部分是排除上限。如果上限是唯一的参数n,则必须知道何时是第一个调用,以及何时是中间(递归)调用。另外,如果内部函数正常,您可以改为从1开始计数,直到按下n

def function1(n):
    def inner(i):
        return 0 if i >= n else i + inner(i + 2)
    return inner(1)

答案 3 :(得分:0)

您只需识别可能要累加的三种范围。

  1. pandoc,其中range(1, n, 2):空范围,所以总和为0
  2. n <= 1,其中range(1, n, 2)n > 1是偶数:范围是1,...,n-1。 (例如n
  3. range(1, 6, 2) == [1, 3, 5],其中range(1, n, 2)n > 1是奇数:范围是1,...,n-2(例如n

将其转换为代码很简单:

range(1, 5, 2) == [1, 3]

但是,这样做的工作量超出了严格的要求,因为从def f_recursive1(n): if n <= 1: return 0 elif n % 2 == 0: return n - 1 + f_recursive1(n-2) else: # n odd return n - 2 + f_recursive1(n-2) 中减去2将永远不会改变其奇偶校验;您无需检查每次递归调用中的n是偶数还是奇数。

n

答案 4 :(得分:0)

如果允许我们进行乘法和除法运算,我希望您认识到,这项特定任务并不仅需要基本情况​​。

Python代码:

def f(n):
  total=0
  for i in range(1,n,2):
    total += i
  return total

def g(n):
  half = n // 2
  return half * half

for n in xrange(100):
  print f(n), g(n)

因为

         *
       * * *
     * * * * *
   * * * * * * *

可以看作是嵌套的折叠行。这是最上面两行:

         *
       * * *
     * *   * *
   * *       * *

让我们逆时针旋转45度

   *  *  *  *
   *  *  *  *
   *  *
   *  *

并添加其他两行折叠

       *
     *   *

   *  *  *  *
   *  *  *  *
   *  *  *  *
   *  *  *

       *

获得

   *  *  *  *
   *  *  *  *
   *  *  *  *
   *  *  *  *

正方形的面积。