Ujian kebakaran: faktorial rekursif

PHPz
Lepaskan: 2024-08-14 10:45:05
asal
1146 orang telah melayarinya

Teste de fogo: fatorial recursivo

Bagi mereka yang tidak mengikuti POJ (Pascal pada JVM) ia adalah pengkompil yang mengubah subset daripada Pascal kepada JASM ( Java Assembly) supaya kita boleh menggunakan JVM sebagai persekitaran pelaksanaan.

Dalam siaran terakhir, sokongan untuk baca/bacaln daripada Pascal telah dilaksanakan, fungsi yang membenarkan membaca data daripada input standard (stdin). Dalam penerbitan ini kami akan melengkapkan salah satu objektif POJ: membaca nombor daripada input standard dan mengira faktorial secara rekursif.

Ketika kami sedang menyusun untuk JVM, adalah perlu untuk memperincikan fungsi pelbagai titik mesin maya yang luar biasa ini. Oleh itu, pada pelbagai masa saya memperincikan fungsi dalaman JVM serta beberapa arahannya (opcodes).

Faktorial rekursif, aising pada kek :-)

Seperti yang dinyatakan pada permulaan projek, salah satu objektif adalah untuk dapat mengira faktorial secara rekursif, membaca nombor yang akan dikira daripada input standard. Pelaksanaan dalam POJ sehingga kini telah membolehkan objektif ini:

  • Hello world: mencipta asas kod projek dengan ANTLR, parser dan penjanaan kod Java Assembly;
  • Tambahan, penolakan, pendaraban, operator bahagi dan permulaan ayat bersyarat - jika: sokongan untuk operator bermula serta sokongan awal untuk ayat bersyarat;
  • Ulang, sambil dan untuk: sokongan untuk struktur pengulangan;
  • Fungsi dalam Pascal: pelaksanaan fungsi rekursif.

Kini masanya telah tiba untuk mengesahkan apa yang telah dibangunkan setakat ini. Yang berkata, daripada program Pascal di bawah:

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.
Salin selepas log masuk

POJ menjana dengan betul pemasangan berikut:

// 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
    }
}
Salin selepas log masuk

Akhirnya, penghujung

Di sini kita sampai ke penghujung perjalanan pembelajaran ini dengan projek ini.

Beberapa perkara menarik dalam bidang penyusun boleh diterokai dengan projek ini (seperti pengoptimuman kod yang dijana). Siapa tahu, mungkin dalam masa terdekat kami akan memulakan siri baharu dengan pengoptimuman :-)

Kod projek lengkap

Repositori dengan kod dan dokumentasi lengkap projek ada di sini.

Atas ialah kandungan terperinci Ujian kebakaran: faktorial rekursif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan