solidity实现斐波那契数列

21 阅读1分钟
  1. 实现一个函数,计算斐波那契数列的第 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)