iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
自我挑戰組

Solidity 初學之路系列 第 8

DAY 8 - 控制流與插入排序

  • 分享至 

  • xImage
  •  

控制流

程式的控制流常見的條件控制、迴圈控制在 Solidity 中也有,注意在使用迴圈時,要確保有適當的結束條件,避免潛在的資源浪費和 gas 消耗。另外迴圈也可以使用 continue (進入下一個迴圈)和 break(跳出目前的迴圈)。

1. if-else

function ifElseTest(uint256 _number) public pure returns(string memory){
    if (_number > 0) {
        return "The number is positive.";
    } else if (_number < 0) {
        return "The number is negative.";
    } else {
        return "The number is zero.";
    }
}

2. for 迴圈

function sumFor(uint n) public pure returns (uint) {
    uint total = 0;
    for (uint i = 1; i <= n; i++) {
        total += i;
    }
    return total;
}

3. while 迴圈

function sumWhile(uint n) public pure returns (uint) {
    uint total = 0;
    uint i = 1;
    while (i <= n) {
        total += i;
        i++;
    }
    return total;
}

4. do-while 迴圈

function sumDoWhile(uint n) public pure returns (uint) {
    uint total = 0;
    uint i = 1;
    do {
        total += i;
        i++;
    } while (i <= n); 
    return total;
}

5. 三元運算子

三元運算子 ?: 是 Solidity 中唯一接受三個運算元的運算子。
語法:<condition>?<expression1>:<expression2>。如果 <condition> 的判斷為 true,結果就是 <expression1>,如果 <condition> 的判斷為 false,結果就是 <expression2>?: 經常作為簡化的 if 條件語句使用。

function ternaryTest(uint256 x, uint256 y) public pure returns(uint256){
    return x >= y ? x: y; 
}

插入排序

插入排序是將一組無序的數列由小到大排好,它會從頭開始將每一個數字與前面的數字比較,如果找到比自己大的數字中最小的,插入到它的前一個。
假設數列是 [2, 5, 3, 1]

用 python 怎麼寫插入排序


i = 1,第 1 圈時,跟 0 比
i = 2,第 2 圈時,跟 1~0 比
i = 3,第 3 圈時,跟 2~0 比
i = 4,第 4 圈時,跟 3~0 比

arr = [2,5,3,1]
def insertSort(arr):
    for i in range(1, len(arr)):
        key = arr[i] # 把 i 的元素暫存到 key
        j = i - 1
        while j >= 0 and arr[j] > key: # 當 j 還沒找完且 key 的前面有更大的數
            arr[j+1] = arr[j] # 第 j 個元素往後 1 個
            j -= 1
        arr[j+1] = key # 把 key 替換到前面
    return arr

用 Solidity 寫插入排序

因為 uint 不可以存到負數,否則運行過程會有 underflow Error,而 j 變數如果按上面的邏輯寫可能會存到負數,所以把 j 加一讓它在計索引過程中最小是 0 就不會引起 Error。

function insertSort(uint[] memory a) public pure returns(uint[] memory) {
    for(uint i = 1; i < a.length; i++){
        uint temp = a[i];
        uint j = i;
        while((j >= 1) && (a[j-1] > temp)){ // 當 j 還沒找完且 temp 的前面有更大的數
            a[j] = a[j-1]; // 第 j-1 個元素往後 1 個
            j--;
        }
        a[j] = temp; // 把 temp 替換到前面
    }
    return(a);
}

運行結果


上一篇
DAY 7 - 變數類型[映射類型]、變數初始值、常數
下一篇
DAY 9 - 建構子與修飾器控制
系列文
Solidity 初學之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言