使用递归的范围(1,n,2)值之和

2024-04-26 04:36:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将循环转换为递归算法。相当简单,我只是不能让它在求和的时候忽略n值,就像range那样。你知道吗

这是迭代函数:

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),那么当它应该是9时,就得到了4,因为它最终是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))

当然这也不起作用。我不是很理解递归吗?你知道吗


Tags: or算法outputreturnifdefrangefunction
3条回答

棘手的部分是排除上限。如果上限是您唯一的参数n,那么您必须知道它何时是第一个调用,何时是中间(递归)调用。或者,如果内部函数正常,您可以从1开始一直数到n

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

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

剩下两种可能性:

  1. 如果n为<;=1,则没有要求和的数字,因此求和为0。你知道吗
  2. 列表中可能包含的最大数是n-1,但前提是它是奇数。不管是哪种方式,剩余的和是“从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)

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

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

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

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

相关问题 更多 >