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 # 正确的缩进位置
额外的潜在优化与边界处理
处理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优化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=1get_fibo(1)返回1,1%2=1,最终输出1,符合预期。
内容的提问来源于stack exchange,提问作者varungupta
相关产品推荐
相关产品推荐

