- 实现一个函数,计算斐波那契数列的第 n 项(注意 gas 限制)。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
contract Demo {
// 实现斐波那契数列
function fibonacci(uint256 n) public pure returns(uint256) {
require(n < 94, "Value too large, will overflow");
if (n == 0 ) return 0;
if (n == 1 || n == 2) return 1;
uint256 prev1 = 1;
uint256 prev2 = 1;
uint256 current = 0;
for(uint256 i = 3; i <= n; i++) {
current = prev1 + prev2;
prev2 = prev1;
prev1 = current;
}
return current;
}
// 带溢出检查的版本
function fibonacciSafe(uint256 n) public pure returns (uint256) {
if (n == 0) return 0;
if (n == 1 || n == 2) return 1;
uint256 prev1 = 1;
uint256 prev2 = 1;
uint256 current = 0;
for (uint256 i = 3; i <= n; i++) {
// 检查加法是否会溢出
if (prev1 > type(uint256).max - prev2) {
revert("Fibonacci: overflow detected");
}
current = prev1 + prev2;
prev2 = prev1;
prev1 = current;
}
return current;
}
// 递归实现 - 仅用于演示,实际使用不推荐(Gas消耗极高)
function fibonacciRecursive(uint256 n) public pure returns (uint256) {
if (n == 0) return 0;
if (n == 1 || n == 2) return 1;
return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
}
}
选择哪种实现方式取决于具体需求:
- 简单计算:迭代方法
- 频繁查询相同值:记忆化方法
- 大n值计算:矩阵快速幂方法
- 避免递归,因为Solidity对调用深度有限制(默认1024)