Menyelesaikan Enigma Mencetak Nombor tanpa Gelung atau Bersyarat
Cabaran mencetak nombor secara berurutan dari 1 hingga 1000 tanpa bergantung pada gelung atau bersyarat membina intrik pengaturcara dengan pendekatan yang tidak konvensional. Bagaimanakah tugas yang kelihatan mudah sedemikian boleh dicapai tanpa alat asas pengaturcaraan?
Membuka Kunci Penyelesaian dalam C
Penyelesaian, seperti yang ditunjukkan dalam coretan kod C di bawah , terletak pada mengeksploitasi aritmetik penunjuk dan rekursi.
#include <stdio.h> #include <stdlib.h> void main(int j) { printf("%d\n", j); (&&main + (&exit - &main)*(j/1000))(j+1); }
Kod ini dengan bijak menggunakan penunjuk fungsi dan rekursi untuk mengelakkan keperluan untuk gelung atau bersyarat. Ia mengira alamat panggilan rekursif seterusnya berdasarkan nisbah j/1000. Dengan memanipulasi alamat fungsi utama dengan teliti, program ini secara berkesan mensimulasikan "lompat" ke nombor seterusnya dalam jujukan.
Varian dalam Standard C
Untuk mereka yang lebih suka pendekatan C yang lebih standard, kod berikut menghapuskan pergantungan pada aritmetik pada fungsi petunjuk:
#include <stdio.h> #include <stdlib.h> void f(int j) { static void (*const ft[2])(int) = { f, exit }; printf("%d\n", j); ft[j/1000](j + 1); } int main(int argc, char *argv[]) { f(1); }
Kedua-dua coretan kod C ini menunjukkan kemungkinan mencetak nombor secara berurutan tanpa gelung atau bersyarat. Mereka mempamerkan kuasa memanipulasi penunjuk fungsi dan rekursi untuk mengatasi sekatan yang kelihatan tidak dapat diatasi.
Atas ialah kandungan terperinci Bagaimanakah Nombor Boleh Dicetak Secara Berurutan dari 1 hingga 1000 Tanpa Gelung atau Pernyataan Bersyarat dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!