首頁 > 後端開發 > Golang > 主體

防火測試:遞歸階乘

PHPz
發布: 2024-08-14 10:45:05
原創
1145 人瀏覽過

Teste de fogo: fatorial recursivo

對於那些不遵循POJ(JVM 上的Pascal)的人來說,它是一個將子集 從Pascal 轉換為JASM 的編譯器( Java Assembly),以便我們可以使用JVM 作為執行環境。

在上一篇文章中,實現了對Pascalread/readln 的支持,這些函數允許從標準輸入(stdin) 讀取數據。在本出版品中,我們將完成 POJ 的目標之一:從標準輸入讀取數字並遞歸計算階乘。

當我們為 JVM 進行編譯時,有必要詳細說明這個令人難以置信的虛擬機器的各個點的功能。因此,我多次詳細介紹 JVM 的內部功能及其一些指令(操作碼)。

遞歸階乘,錦上添花:-)

正如專案開始時所提到的,目標之一是能夠遞歸計算階乘,從標準輸入中讀取要計算的數字。迄今為止 POJ 中的實現已經使這一目標成為可能:

  • Hello world:使用 ANTLR、解析器和程式碼產生建立了專案的程式碼庫Java Assembly;
  • 加法、減法、乘法、除法運算子和條件句開頭 - if:開始支援運算子以及初步支援條件句;
  • Repeat、while 和 for:支援重複結構;
  • Pascal 中的函數:遞歸函數的實作。

現在是時候驗證迄今為止所開發的內容了。也就是說,來自下面的 Pascal 程式:

program fatorial;

var numero : integer;

function fatorial(n : integer) : integer;
begin
    if n<0 then fatorial := 0
    else begin
        if n<=1 then fatorial := 1
        else fatorial := n * fatorial(n-1);
    end;
end;

begin
    write('Introduza numero inteiro: ');
    readln(numero);
    writeln;
    writeln('O fatorial de ', numero, ' e: ', fatorial(numero));
end.
登入後複製

POJ 正確產生以下 程序集:

// Code generated by POJ 0.1
public class fatorial {
    public static numero I

    static fatorial(I)I {
        iload 0
        sipush 0
        if_icmpge L4
        iconst 1 
        goto L5
    L4: iconst 0 
    L5: ifeq L1
        sipush 0
        istore 100
        goto L2
    L1: iload 0
        sipush 1
        if_icmpgt L9
        iconst 1 
        goto L10
    L9: iconst 0 
    L10:ifeq L6
        sipush 1
        istore 100
        goto L7
    L6: iload 0
        iload 0
        sipush 1
        isub 
        invokestatic fatorial.fatorial(I)I 
        imul 
        istore 100
L7: L2: iload 100
        ireturn 
    }

    public static main([java/lang/String)V {
        getstatic java/lang/System.out java/io/PrintStream
        ldc "Introduza numero inteiro: "
        invokevirtual java/io/PrintStream.print(java/lang/String)V

        invokestatic java/lang/System.console()java/io/Console
        invokevirtual java/io/Console.readLine()java/lang/String
        invokestatic java/lang/Integer.parseInt(java/lang/String)I
        putstatic fatorial.numero I

        getstatic java/lang/System.out java/io/PrintStream
        invokevirtual java/io/PrintStream.println()V

        getstatic java/lang/System.out java/io/PrintStream
        ldc "O fatorial de "
        invokevirtual java/io/PrintStream.print(java/lang/String)V

        getstatic java/lang/System.out java/io/PrintStream
        getstatic fatorial.numero I
        invokevirtual java/io/PrintStream.print(I)V

        getstatic java/lang/System.out java/io/PrintStream
        ldc " e: "
        invokevirtual java/io/PrintStream.print(java/lang/String)V

        getstatic java/lang/System.out java/io/PrintStream
        getstatic fatorial.numero I
        invokestatic fatorial.fatorial(I)I 
        invokevirtual java/io/PrintStream.print(I)V

        getstatic java/lang/System.out java/io/PrintStream
        invokevirtual java/io/PrintStream.println()V

        return
    }
}
登入後複製

最後,結束

我們透過這個計畫結束了這次學習之旅。

可以透過這個專案探索編譯器領域的一些有趣的事情(例如產生程式碼的最佳化)。誰知道呢,也許在不久的將來我們會開始一個新的最佳化系列:-)

完整的專案程式碼

包含項目完整程式碼和文件的儲存庫位於此處。

以上是防火測試:遞歸階乘的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板