Rumah > Artikel > tutorial komputer > Laksanakan fungsi kuasa secara rekursif dalam bahasa C dan panggilnya dalam fungsi utama
/*x^n hendaklah kurang daripada 32767, jika tidak, output akan menjadi nombor negatif. Ini kerana julat nilai jenis int adalah terhad Fungsi pow biasa biasanya menggunakan jenis apungan atau berganda, dan parameter juga harus jenis apungan atau berganda. */
#include
kuasa int(int x,int n)
{
jika (n>1)
{
kembali x*kuasa(x,n-1);
}
lain
{
jika (n>0)
kembali x;
lain
kembali 1;
}
}
void main()
{
int x,n;
printf("input x,n:");
scanf("%d%d",&x,&n);
printf("%d",kuasa(x,n));
getch();
clrscr();
}
Program rekursif anda adalah salah Saya akan memindahkan yang betul dengan penjelasan Anda boleh lihat.
Rekursi dan panggilan fungsi bahasa
1. Kandungan asas:
Fungsi dalam bahasa C boleh dipanggil secara rekursif iaitu boleh dipanggil secara langsung (simple recursion) atau secara tidak langsung (indirect recursion).
Mata:
1. Fungsi bahasa C boleh dipanggil secara rekursif.
2 Ia boleh dipanggil secara langsung atau tidak. Pada masa ini hanya panggilan rekursif langsung dibincangkan.
2. Keadaan rekursi
Menggunakan kaedah rekursif untuk menyelesaikan masalah mesti memenuhi tiga syarat berikut:
1. Masalah yang ingin diselesaikan boleh diubah menjadi masalah baru, dan penyelesaian kepada masalah baru ini masih sama dengan penyelesaian asal, kecuali objek yang diproses bertambah atau berkurang secara teratur.
Nota: Kaedah untuk menyelesaikan masalah adalah sama Parameter untuk memanggil fungsi adalah berbeza setiap kali (kenaikan atau penurunan biasa Jika tiada corak, panggilan rekursif tidak boleh digunakan.
2 Proses transformasi ini boleh diaplikasikan untuk menyelesaikan masalah.
Nota: Menggunakan kaedah lain adalah menyusahkan atau sukar untuk diselesaikan, tetapi menggunakan kaedah rekursif boleh menyelesaikan masalah dengan baik.
3. Mesti ada syarat yang jelas untuk menamatkan rekursi.
Nota: Pastikan anda menamatkan panggilan rekursif di tempat yang sesuai. Jika tidak, sistem mungkin ranap.
3. Contoh rekursif
Contoh: Menggunakan kaedah rekursif n!
Apabila n>1, n! Masalahnya boleh diubah menjadi n*(n-1)! soalan baru.
Contohnya n=5:
Bahagian satu: 5*4*3*2*1 n*(n-1)!
Bahagian 2: 4*3*2*1 (n-1)*(n-2)!
Bahagian 3: 3*2*1 (n-2)(n-3)!
Bahagian 4: 2*1 (n-3)(n-4)!
Bahagian 5: 1 (n-5) 5-5=0, dapatkan nilai 1, tamatkan rekursi.
Sumber program:
fac(int n)
{int t;
jika(n==1)||(n==0) kembalikan 1;
lain
{ t=n*fac(n-1);
kembali t;
}
}
utama( )
{int m,y;
printf(“Masukkan m:”);
scanf(“%d”,&m);
jika(m
lain
{y=fac(m);
printf(“n%d! =%d n”,m,y);
}
}
4. Penjelasan rekursi
1 Apabila fungsi memanggil dirinya sendiri, sistem akan secara automatik mengekalkan pembolehubah semasa dan parameter formal dalam fungsi semasa pusingan panggilan baharu, sistem akan membuka lokasi lain untuk pembolehubah dan parameter formal yang digunakan oleh fungsi yang baru dipanggil. . unit storan (ruang memori). Pembolehubah yang digunakan dalam setiap panggilan fungsi berada dalam ruang memori yang berbeza.
2. Lebih banyak tahap panggilan rekursif, lebih banyak unit storan diduduki oleh pembolehubah dengan nama yang sama. Adalah penting untuk diingat bahawa setiap kali fungsi dipanggil, sistem akan membuka ruang memori baharu untuk pembolehubah fungsi tersebut.
3 Apabila fungsi yang dipanggil kali ini tamat, sistem akan melepaskan ruang memori yang diduduki oleh panggilan ini. Aliran program kembali ke titik panggilan lapisan sebelumnya, dan pada masa yang sama memperoleh data ruang memori yang diduduki oleh pembolehubah dan parameter formal dalam fungsi apabila memasuki lapisan ini.
4. Semua masalah rekursif boleh diselesaikan dengan kaedah bukan rekursif, tetapi untuk beberapa masalah rekursif yang lebih kompleks, menggunakan kaedah bukan rekursif sering menjadikan program ini sangat rumit dan sukar dibaca fungsi rekursif sangat berguna dalam menyelesaikan masalah tersebut Ini boleh menjadikan atur cara ringkas dan jelas dengan kebolehbacaan yang lebih baik, bagaimanapun, semasa proses panggilan rekursif, sistem perlu membuka ruang memori untuk pembolehubah dalam setiap lapisan panggilan, mengingati titik kembali selepas setiap lapisan panggilan, dan memerlukan. untuk menambah banyak overhed tambahan, jadi panggilan rekursif ke fungsi biasanya mengurangkan kecekapan menjalankan program.
5
fac(int n) /*Gunakan parameter berbeza untuk setiap panggilan*/{ int t; /* Setiap panggilan akan membuka ruang memori yang berbeza untuk pembolehubah t*/
jika(n==1)||(n==0) /*Kembali 1 apabila syarat ini dipenuhi */
kembali 1;
lain
{ t=n*fac(n-1); /*Setiap kali program dijalankan di sini, fungsi ini akan dipanggil semula dengan n-1 sebagai parameter Ini ialah titik panggilan*/
kembali t; /*Jalankan di sini hanya apabila semua proses yang dipanggil dalam ayat sebelumnya telah tamat. */
}
}
Atas ialah kandungan terperinci Laksanakan fungsi kuasa secara rekursif dalam bahasa C dan panggilnya dalam fungsi utama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!