fork(1) download
  1. //recursive
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. void rec1( int now, int n ) {
  6. // одоо явж байгаа тоо нь n гэсэн тооноос бага буюу тэнцүү нь
  7. // үнэн ба now-1 тоо хүртэл хэвлэсэн нь ч үнэн. Тиймээс now
  8. // гэсэн тоогоо хэвлэнэ.
  9. cout << now << " ";
  10.  
  11. if( now == n ) {
  12. // энэд одоо явж байгаа тоо нь n тоотой тэнцүү тул
  13. // n+1 гэсэн тоог хэвлэх шаардлагагүй тул энэ хүрээд
  14. // зогсох ёстой.
  15. return;
  16. }
  17. // үгүй бол рекурсив үргэлжлэх ёстой. ба now+1 гэсэн тоог
  18. // хэвлэх ёстой.
  19. rec1( now+1, n );
  20. }
  21.  
  22. void rec2( int now, int x ) {
  23. if( now == 0 ) {
  24. // одоо байгаа тоо нь 0 гэсэн тул бид 0 хүртэл хэвлэсэн
  25. // гэж үзэх тул энэ хүрээд зогсоно.
  26. return;
  27. }
  28. // эсрэг тохиолдолд now нь 1-ээс их буюу тэнцүү ба бид өмнөх
  29. // тоонуудыг хэвлэх ёстой тул now-1 гэж дуудна.
  30. rec2( now-1, x );
  31. // энэ тохиолдолд бид now-1 хүртэл хэвлэсний дараа энэ
  32. // үйлдэл хийгдэх. тиймээс одоо now гэсэн тоогоо нэмж
  33. // хэвлэнэ гэсэн үг юм.
  34. cout << now << " ";
  35. }
  36.  
  37. int main() {
  38. /*
  39. Рекурсив гэж юу вэ? Энэ нь өөрөө өөрийгөө дуудаж чаддаг функц юм. Жишээгээр
  40. ойлгомжтой байх болов уу? Жишээ нь бид 1 ээс N хүртэл хэвлэмээр байлаа.
  41. Мэдээж үүнийг хийхэд амархан. Бид while, эсвэл for ашиглаад үүнийг шийдэж
  42. болно. Харин Рекурсив ашиглаад үүнийг хийвэл хэрхэн хийгдэх талаар.
  43. 1. Бид 1 гэсэн тоог хэвлээд дараа нь 2 гэсэн тоог хэвлэнэ. харин дараа нь
  44. 3 гэх мэт энэ нь N хүрээд зогсоно. Тэгвэл рекурсивийн зогсох нөхцөл нь
  45. N гэсэн үг ба бид N-ээс ялгаатай K гэсэн тоог хэвлэсэн тохиолдолд 1-ээс
  46. K хүртэл бүх тоог хэвлэсэн гэсэн үг ба K < N бага тул K+1 гэсэн тоог
  47. хэвлэх ёстой ба. Үргэлжлүүлэн хэвлэх ёстой гэсэн үг юм. Харин K == N
  48. нөхцөл биелбэл бид N хүртэлх бүх тоог хэвлэсэн гэсэн үг юм. Тиймээс
  49. үүгээр зогсоно.
  50. 2. Бид N гэсэн тоог N-1 хүртэлх тоо хэвлэгдсэн гэж үзвэл үүний ард N гэсэн
  51. тоогоо хэвлэхэд хангалттай гэсэн үг юм. Тэгвэл N хүртэл хэвлэхийн тулд
  52. N-1 хүртэл хэвлэсэн байх ёстой. N-1-ыг хэвлэхийн тулд N-2 хүртэл хэвлэсэн
  53. байх ёстой гэх мэт 2 гэсэн тоог хэвлэхийн тулд 1 гэсэн тоог хэвлэх хэрэгтэй
  54. юм. Харин 1 гэсэн тоог хэвлэхийн тулд 0 хүртэл хэвлэх хэрэгтэй ба бид 0-ийг
  55. хэвлэх ёсгүй тул энэ хүрээд зогсоно. Харин одоо 0 хүртэл хэвлэсэн. Иймээс
  56. 1-ийг хэвлэнэ. Ингэснээр 1 хүртэл хэвлэсэн. Иймээс 2-ыг хэвлэнэ. Ингэснээр
  57. 2 хүртэл хэвлэсэн. Энэ мэд бид N хүртэл хэвлэх юм.
  58. Ер нь бол өөрийгөө дуудсаны дараа бичсэн юм нь тэр дуудсан хэсгийг зогсох буюу
  59. бодоод дууссаны дараа хийгдэнэ гэсэн үг юм
  60. */
  61. int n; cin >> n;
  62.  
  63. rec1( 1, n ); cout << endl;
  64. rec2( n, n ); cout << endl;
  65.  
  66. return 0;
  67. }
Success #stdin #stdout 0s 4376KB
stdin
13
stdout
1 2 3 4 5 6 7 8 9 10 11 12 13 
1 2 3 4 5 6 7 8 9 10 11 12 13