Bài học 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中運行和驗證此代碼。

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
Danh mục
Bài học 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中運行和驗證此代碼。

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.