Mencetak Nombor dari 1 hingga 1000 Tanpa Gelung atau Syarat
Cabaran yang dikemukakan kepada pengaturcara adalah untuk mencetak nombor dari 1 hingga 1000 tanpa menggunakan sebarang struktur gelung atau pernyataan bersyarat. Tugasan ini memerlukan pendekatan kreatif untuk mengelakkan kaedah biasa untuk melelaran melalui julat nombor.
Satu penyelesaian dalam C atau C mengeksploitasi sifat rekursif panggilan fungsi. Kod berikut memintas gelung dan syarat:
#include <stdio.h> #include <stdlib.h> void main(int j) { printf("%d\n", j); (&&main + (&exit - &main)*(j/1000))(j+1); }
Di sini, keajaibannya terletak pada penggunaan penunjuk fungsi. Ungkapan &utama mewakili alamat fungsi utama, manakala &keluar - &utama mengira saiz fungsi dalam ingatan. Dengan mendarab (j/1000) dengan nilai ini, fungsi secara rekursif memanggil dirinya sendiri, mengalihkan lokasinya dalam ingatan dengan jumlah yang sesuai. Ini membenarkan penambahan j sebanyak 1 dan meneruskan proses pencetakan tanpa sebarang mekanisme gelung yang jelas.
Memandangkan kod asal mempunyai masalah dengan aritmetik penunjuk, versi yang dipertingkatkan dalam standard C disediakan di bawah:
#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); }
Dalam versi ini, susunan statik penunjuk fungsi digunakan untuk mengelakkan kebimbangan aritmetik penunjuk. Fungsi utama memulakan tatasusunan dengan dua elemen: f itu sendiri untuk meneruskan rekursi dan keluar apabila nilai j akhir dicapai, menandakan tamatnya proses.
Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Mencetak Nombor 1 hingga 1000 Tanpa Gelung atau Pernyataan Bersyarat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!