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

Python计算第n个斐波那契数模m报错:NoneType与int无法取模

解决你的Pisano序列计算斐波那契取模报错问题

首先看你的错误信息:TypeError: unsupported operand type(s) for %: 'NoneType' and 'int',这说明get_fibo(rem)返回了None,而你试图对None和整数m取模,这在Python里是不允许的。

最可能的问题:代码缩进错误

检查你的get_fibo函数,我猜测你可能不小心把return curr缩进在了for循环的内部,比如写成了这样:

def get_fibo(n):
    if(n<1):
        return n
    prev=0
    curr=1
    for i in range(n-1):
        (prev,curr)=(curr,prev+curr)
        return curr  # 这里缩进错了!

如果是这样,当n=1时(比如你的测试用例中rem=100%3=1),range(n-1)就是range(0),循环根本不会执行,函数没有触发任何return语句,就会默认返回None,这就导致了后续的报错。

修正后的get_fibo函数应该把return curr放在for循环外面,和循环同级:

def get_fibo(n):
    if n < 1:
        return n
    prev = 0
    curr = 1
    for i in range(n-1):
        prev, curr = curr, prev + curr
    return curr  # 正确的缩进位置

额外的潜在优化与边界处理

  1. 处理m=1的情况:
    当m=1时,任何数模1都是0,你可以在huge_fibo里直接返回0,避免pisano_len(1)可能因为循环没找到周期而返回None的问题:

    def huge_fibo(n,m):
        if m == 1:
            return 0
        rem = n % pisano_len(m)
        return get_fibo(rem) % m
    
  2. 优化Pisano周期的循环范围:
    根据Pisano序列的性质,周期的上限是6*m,比m*m+1小很多,你可以把循环范围改成range(6*m),提升效率:

    def pisano_len(m):
        prev, next_val = 0, 1  # 避免用next作为变量名,它是Python内置函数
        for i in range(6 * m):
            prev, next_val = next_val, (prev + next_val) % m
            if prev == 0 and next_val == 1:
                return i + 1
    

    另外,不要用next作为变量名,它是Python的内置函数,容易引发混淆和潜在问题。

测试你的用例

修正后,输入100 2:

  • pisano_len(2)返回3,100%3=1
  • get_fibo(1)返回1,1%2=1,最终输出1,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:44:19