You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用递归实现range(1,n,2)求和?迭代转递归遇边界问题

嘿,我来帮你理清这个问题~你遇到的核心问题是没把递归的逻辑和range(1,n,2)的规则对应上——range是不包含终止值n的,但你原来的递归直接把n加入了求和,结果自然就错了。

先拆解下迭代函数的本质:range(1,n,2)生成的是所有小于n的正奇数,比如n=5时取1、3,n=6时取1、3、5,n=1时没有元素。我们的递归逻辑必须严格匹配这个规则。

问题出在哪?

你写的function1(n)把n当成了要累加的元素,比如function1(5)会计算5+3+1=9,但实际上我们需要的是小于5的奇数和(1+3=4)。递归的终止条件和递归步骤都没贴合range的“排除终止值”规则。

正确的递归实现

这里给你两种符合需求的递归写法:

方式一:贴合循环逻辑的递归

这种写法直接对应迭代的思路,先判断n的奇偶性,决定是否要加入当前奇数:

def function1(n):
    # 终止条件:当n<=1时,没有符合要求的奇数,返回0
    if n <= 1:
        return 0
    if n % 2 == 0:
        # n是偶数,小于n的最大奇数是n-1,累加后递归处理更小的范围
        return (n-1) + function1(n-2)
    else:
        # n是奇数,本身不包含在range里,直接递归处理n-1(偶数)的情况
        return function1(n-1)

测试验证:

function1(5)  # 输出4,正确
function1(6)  # 输出9,正确
function1(1)  # 输出0,正确
function1(2)  # 输出1,正确

方式二:更简洁的递归写法

先找到小于n的最大奇数,再递归累加该奇数及更小范围的和:

def function1(n):
    if n <= 1:
        return 0
    # 找到小于n的最大奇数
    last_odd = n-1 if n % 2 == 0 else n-2
    # 递归求和:当前最大奇数 + 小于它的所有奇数的和
    return last_odd + function1(last_odd)

测试结果和上面完全一致,逻辑更紧凑。

补充:用数学规律简化

其实从1开始的连续k个奇数的和等于k²,而这里的k就是n//2(比如n=5时k=2,和为2²=4;n=6时k=3,和为3²=9)。如果想用这个规律写递归,也可以这样:

def function1(n):
    k = n // 2
    if k == 0:
        return 0
    # 利用k² = (k-1)² + (2k-1),2k-1就是对应的奇数
    return (2*k -1) + function1(n-2)

总结

你对递归的理解没问题,只是一开始没把递归的终止条件、递归步骤和range的“排除终止值”规则对应上。只要明确我们要累加的是小于n的奇数,而不是到n为止的奇数,就能写出正确的递归逻辑啦。

内容的提问来源于stack exchange,提问作者Graciela Carrillo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:28:40