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

Gra*_*llo 6 python recursion

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

这是迭代函数:

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

function(5) # Output: 4
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的递归:

def function1(n):
    if n==1:
        return n
    else:
        return n+function1(n-2)
function(5) # Output: 9
Run Code Online (Sandbox Code Playgroud)

所以,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!!
Run Code Online (Sandbox Code Playgroud)

但是后来我意识到,这仅适用于奇数。不连。如果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))
Run Code Online (Sandbox Code Playgroud)

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

tob*_*s_k 2

棘手的部分是排除上限。如果上限是您唯一的参数n,您必须知道何时是第一次调用,何时是中间(递归)调用。或者,如果内部函数没问题,您可以从 1 开始计数,直到您点击n

def function1(n):
    def inner(i):
        return 0 if i >= n else i + inner(i + 2)
    return inner(1)
Run Code Online (Sandbox Code Playgroud)