الدرس رقم 5

遞歸視圖與斐波那契數列

在計算機科學領域,遞歸指問題的解決方案取決於相衕問題的較小實例。它是一個函數作爲子程序調用自身的過程。這使得函數可以用較少的參數被調用,減少了函數需要維護的狀態信息的數量,併提供了一種簡潔的方式來錶達解決某些類型問題的方法。對於初學者來説,遞歸通常被認爲是一個具有挑戰性的概念,但如果學習得當,它可以成爲程序員的一個強大工具,有助於創建更簡潔的代碼,併且通常可以用來用簡單的方案解決覆雜問題。 在本課中,我們將把遞歸應用於斐波那契數列。斐波那契數列是一串數字,從第三個數字開始,每個數字都是前兩個數字之和,如0、1、1、2、3、5、8、13、21、34,以此類推。該數列從0開始,第n個數字是第(n-1)個和第(n-2)個數字的和。

SmartPy中的遞歸視圖

在SmartPy中,遞歸是通過允許函數在其自己的定義中調用自身來實現的。在處理可以分解爲更小的、相衕的子問題時,這種方法非常有用。視圖(view)是一個SmartPy函數,它不會修改合約存儲,但可以讀取合約內容。我們所説的遞歸視圖是指在執行過程中調用自身的視圖函數。

斐波那契數列

斐波那契數列是一組數字,前兩項爲0和1,從第三項開始,每個數字都是前兩個數字的和。這個數列雖然簡單,但由於它是遞歸性的,可以很好地幫助我們理解遞歸。

斐波那契數列由遞歸關繫定義:

SCSS
F(n) = F(n-1) + F(n-2)

該數列中,初始條件是F(0) = 0和F(1) = 1。要得到斐波那契數列中的第n個數字,我們隻需將第(n-1)個和第(n-2)個數字相加。這種遞歸性正是斐波那契數列非常適合理解遞歸的原因。了解了遞歸及其在斐波那契數列中的應用之後,我們將深入研究實現遞歸視圖以計算斐波那契數列的SmartPy代碼。

代碼解析

以下SmartPy代碼定義了一個合約FibonacciView,它使用遞歸視圖計算斐波那契數列。這個例子可以很好地幫助我們理解如何在SmartPy中創建和使用遞歸函數。

Python
import smartpy as sp


@sp.module
def main():
    class FibonacciView(sp.Contract):
        """Contract with a recursing view to compute the sum of fibonacci numbers."""

        @sp.onchain_view()
        def fibonacci(self, n):
            """Return the sum of fibonacci numbers until n.

            Args:
                n (sp.int): number of fibonacci numbers to sum.
            Return:
                (sp.int): the sum of fibonacci numbers
            """
            sp.cast(n, int)
            if n < 2:
                return n
            else:
                n1 = sp.view("fibonacci", sp.self_address(), n - 1, int).unwrap_some()
                n2 = sp.view("fibonacci", sp.self_address(), n - 2, int).unwrap_some()
                return n1 + n2


if "templates" not in __name__:

    @sp.add_test(name="FibonacciView basic scenario", is_default=True)
    def basic_scenario():
        sc = sp.test_scenario(main)
        sc.h1("Basic scenario.")
        sc.h2("Origination.")
        c1 = main.FibonacciView()
        sc += c1
        sc.verify(c1.fibonacci(8) == 21)

這個FibonacciView合約包含一個遞歸視圖函數fibonacci,它返回第n個斐波那契數。

該函數用@sp.onchain_view()裝飾器,錶示這是對合約存儲的隻讀操作。該函數將整數n作爲參數,代錶我們要檢索的斐波那契數列中的位置。

在函數內部,爲了安全起見,我們首先將n轉換爲整數。接下來是函數的遞歸部分。如果n小於2,我們隻返回n,因爲斐波那契數列的前兩個數字是0和1。如果n大於或等於2,我們用遞歸的方式調用n-1n-2fibonacci函數,然後將結果相加來計算第n個斐波那契數。這符合定義斐波那契數列的遞歸關繫。sp.view調用創建了對fibonacci函數本身的遞歸調用。

我們繼續看看測試部分。

在測試函數basic_scenario中,創建一個新的FibonacciView合約實例,將其添加到本場景中,然後使用sc.verify檢查第8個斐波那契數是否爲21,若是,則斐波那契數列是正確的。

在SmartPy IDE中運行代碼

運行代碼:

  1. 打開SmartPy IDE

  2. 將我們提供的代碼覆製併粘貼到編輯器中。

  3. 單擊“Run”按鈕,在IDE右側會顯示正在執行的測試場景。你可以看到正在執行的操作和驗證的檢查。
    在這節課中,我們介紹了很多高級概念,包括遞歸的基礎知識、它在編程中的使用、SmartPy中的遞歸視圖,以及遞歸在斐波那契數列中的應用。我們還探討了SmartPy中的一個工作代碼示例,還學習了如何在SmartPy IDE中運行和驗證此代碼。

إخلاء المسؤولية
* ينطوي الاستثمار في العملات الرقمية على مخاطر كبيرة. فيرجى المتابعة بحذر. ولا تهدف الدورة التدريبية إلى تقديم المشورة الاستثمارية.
* تم إنشاء الدورة التدريبية من قبل المؤلف الذي انضم إلى مركز التعلّم في Gate. ويُرجى العلم أنّ أي رأي يشاركه المؤلف لا يمثّل مركز التعلّم في Gate.
الكتالوج
الدرس رقم 5

遞歸視圖與斐波那契數列

在計算機科學領域,遞歸指問題的解決方案取決於相衕問題的較小實例。它是一個函數作爲子程序調用自身的過程。這使得函數可以用較少的參數被調用,減少了函數需要維護的狀態信息的數量,併提供了一種簡潔的方式來錶達解決某些類型問題的方法。對於初學者來説,遞歸通常被認爲是一個具有挑戰性的概念,但如果學習得當,它可以成爲程序員的一個強大工具,有助於創建更簡潔的代碼,併且通常可以用來用簡單的方案解決覆雜問題。 在本課中,我們將把遞歸應用於斐波那契數列。斐波那契數列是一串數字,從第三個數字開始,每個數字都是前兩個數字之和,如0、1、1、2、3、5、8、13、21、34,以此類推。該數列從0開始,第n個數字是第(n-1)個和第(n-2)個數字的和。

SmartPy中的遞歸視圖

在SmartPy中,遞歸是通過允許函數在其自己的定義中調用自身來實現的。在處理可以分解爲更小的、相衕的子問題時,這種方法非常有用。視圖(view)是一個SmartPy函數,它不會修改合約存儲,但可以讀取合約內容。我們所説的遞歸視圖是指在執行過程中調用自身的視圖函數。

斐波那契數列

斐波那契數列是一組數字,前兩項爲0和1,從第三項開始,每個數字都是前兩個數字的和。這個數列雖然簡單,但由於它是遞歸性的,可以很好地幫助我們理解遞歸。

斐波那契數列由遞歸關繫定義:

SCSS
F(n) = F(n-1) + F(n-2)

該數列中,初始條件是F(0) = 0和F(1) = 1。要得到斐波那契數列中的第n個數字,我們隻需將第(n-1)個和第(n-2)個數字相加。這種遞歸性正是斐波那契數列非常適合理解遞歸的原因。了解了遞歸及其在斐波那契數列中的應用之後,我們將深入研究實現遞歸視圖以計算斐波那契數列的SmartPy代碼。

代碼解析

以下SmartPy代碼定義了一個合約FibonacciView,它使用遞歸視圖計算斐波那契數列。這個例子可以很好地幫助我們理解如何在SmartPy中創建和使用遞歸函數。

Python
import smartpy as sp


@sp.module
def main():
    class FibonacciView(sp.Contract):
        """Contract with a recursing view to compute the sum of fibonacci numbers."""

        @sp.onchain_view()
        def fibonacci(self, n):
            """Return the sum of fibonacci numbers until n.

            Args:
                n (sp.int): number of fibonacci numbers to sum.
            Return:
                (sp.int): the sum of fibonacci numbers
            """
            sp.cast(n, int)
            if n < 2:
                return n
            else:
                n1 = sp.view("fibonacci", sp.self_address(), n - 1, int).unwrap_some()
                n2 = sp.view("fibonacci", sp.self_address(), n - 2, int).unwrap_some()
                return n1 + n2


if "templates" not in __name__:

    @sp.add_test(name="FibonacciView basic scenario", is_default=True)
    def basic_scenario():
        sc = sp.test_scenario(main)
        sc.h1("Basic scenario.")
        sc.h2("Origination.")
        c1 = main.FibonacciView()
        sc += c1
        sc.verify(c1.fibonacci(8) == 21)

這個FibonacciView合約包含一個遞歸視圖函數fibonacci,它返回第n個斐波那契數。

該函數用@sp.onchain_view()裝飾器,錶示這是對合約存儲的隻讀操作。該函數將整數n作爲參數,代錶我們要檢索的斐波那契數列中的位置。

在函數內部,爲了安全起見,我們首先將n轉換爲整數。接下來是函數的遞歸部分。如果n小於2,我們隻返回n,因爲斐波那契數列的前兩個數字是0和1。如果n大於或等於2,我們用遞歸的方式調用n-1n-2fibonacci函數,然後將結果相加來計算第n個斐波那契數。這符合定義斐波那契數列的遞歸關繫。sp.view調用創建了對fibonacci函數本身的遞歸調用。

我們繼續看看測試部分。

在測試函數basic_scenario中,創建一個新的FibonacciView合約實例,將其添加到本場景中,然後使用sc.verify檢查第8個斐波那契數是否爲21,若是,則斐波那契數列是正確的。

在SmartPy IDE中運行代碼

運行代碼:

  1. 打開SmartPy IDE

  2. 將我們提供的代碼覆製併粘貼到編輯器中。

  3. 單擊“Run”按鈕,在IDE右側會顯示正在執行的測試場景。你可以看到正在執行的操作和驗證的檢查。
    在這節課中,我們介紹了很多高級概念,包括遞歸的基礎知識、它在編程中的使用、SmartPy中的遞歸視圖,以及遞歸在斐波那契數列中的應用。我們還探討了SmartPy中的一個工作代碼示例,還學習了如何在SmartPy IDE中運行和驗證此代碼。

إخلاء المسؤولية
* ينطوي الاستثمار في العملات الرقمية على مخاطر كبيرة. فيرجى المتابعة بحذر. ولا تهدف الدورة التدريبية إلى تقديم المشورة الاستثمارية.
* تم إنشاء الدورة التدريبية من قبل المؤلف الذي انضم إلى مركز التعلّم في Gate. ويُرجى العلم أنّ أي رأي يشاركه المؤلف لا يمثّل مركز التعلّم في Gate.