繁体   English   中英

编写一个 function (递归),它将计算从 1 到 n 的偶数之和

[英]write a function (recursive) that will calculate the sum of even numbers from 1 to n

我必须编写一个递归 function 来计算从 1 到 n 的偶数之和。 例如,对于n=input= 6 ,预期的output would be: 2+4+6 = 12

def sum_of_even(n):
    if not n % 2 == 0:
        return n
    else:
        return n + sum_of_even(n-1)


print(sum_of_even(6))

这给出了 output 11,但我什至不知道我的概念是否正确

对代码进行最少的修改:

def sum_of_even(n):
    if n==0:
        return 0
    if not n % 2 == 0:
        return sum_of_even(n-1)
    else:
        return n + sum_of_even(n-1)


print(sum_of_even(10))

您的代码有两个问题:

  1. 当数字是偶数时,您没有返回到目前为止计算的值。 相反,您正在返回输入值 n。 通过这样做,您只是简单地将前一个 n 值求和到value n + sum_of_even(n-1) 因此,当您print(sum_of_even(6))时,它返回6 + sum_of_even(6-1) ,即 11。如果您print(sum_of_even(5)) ,它只会返回 5。

  2. 由于上述停止条件不正确,您需要一个合适的停止条件。 您想添加所有偶数直到零(而不是-inf ),所以:

if n==0:
    return 0

编辑:或者,由 Stef 建议,当你找到你的第一个偶数时,你可以简单地移动 2 乘 2 而不是 1 乘 1:

def sum_of_even(n):
    if n<=0:
        return 0
    if not n % 2 == 0:
        return sum_of_even(n-1)
    else:
        return n + sum_of_even(n-2)
def sum_of_even(n):
    sum1 = 0
    if n == 0:
        return sum1

    elif n % 2 == 0:
        sum1 += n
    
    return sum1 + sum_of_even(n - 1)

这应该这样做。 您的代码中唯一缺少的是当n==0时它应该停止的条件。

你可以试试这个:

def sum_even_numbers(number):
    if number == 0:
        return 0

    if number % 2 == 0:
        return number + sum_even_numbers(number - 1)  # (number - 2) is also ok
    else:
        return sum_even_numbers(number - 1)

我会推荐一种分而治之的方法,基于这样一种想法,即可以通过将前半范围的总和与后半范围的总和相加来找到整个范围的总和。 对于每个递归调用,这会将子问题的大小分成两半,而不是一次减少一个。 其他提出的解决方案将破坏大于 2000 的输入的递归堆栈,而这种方法适用于巨大的数字。

def sum_of_even(upperlim, lowerlim = 2):
    if upperlim <= lowerlim:
        if upperlim == lowerlim:
            return upperlim
        else:
            return 0
    midpoint = lowerlim + (upperlim - lowerlim) // 2
    if midpoint % 2 == 0:
        return sum_of_even(upperlim, midpoint + 2) + sum_of_even(midpoint, lowerlim)
    else:
        return sum_of_even(upperlim, midpoint + 1) + sum_of_even(midpoint - 1, lowerlim)

def cross_check(n):
    half_n = n // 2
    return half_n * (half_n + 1)

n = 1000000
print(sum_of_even(n))   # => 250000500000
print(cross_check(n))   # => 250000500000

如您所见,我还提供了一个cross_check例程来确认答案。 这是基于以下观察结果:直到n的偶数值之和等于2*(1 + 2 +... + n // 2) (请注意,无论n是偶数还是奇数,这都是正确的。)直到k的整数之和是众所周知的结果, k * (k + 1) / 2 因此,为k插入n // 2 ,并注意到 2 的取消,我们得到了cross_check中的公式——这是你真正应该使用的,而不是递归。

有一个封闭的公式,所以不需要迭代:因为即使你得到三角形数列的双精度数,所以公式是 /2(/2+1)/2 的双精度数,即 /2(/ 2+1)。 对于奇数,结果与 -1 相同。

所以代码可以是:

def sum_of_even(n):
    return (n // 2) * (n // 2 + 1)

使用递归计算前10个偶数的总和

def even_sum(n):
    if n%2==0:
        if n==2:
            return 2
        else:
            return(n+even_sum(n-2))
print(even_sum(20))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM