//recursive
#include <iostream>
using namespace std;
void rec1( int now, int n ) {
// одоо явж байгаа тоо нь n гэсэн тооноос бага буюу тэнцүү нь
// үнэн ба now-1 тоо хүртэл хэвлэсэн нь ч үнэн. Тиймээс now
// гэсэн тоогоо хэвлэнэ.
cout << now << " ";
if( now == n ) {
// энэд одоо явж байгаа тоо нь n тоотой тэнцүү тул
// n+1 гэсэн тоог хэвлэх шаардлагагүй тул энэ хүрээд
// зогсох ёстой.
return;
}
// үгүй бол рекурсив үргэлжлэх ёстой. ба now+1 гэсэн тоог
// хэвлэх ёстой.
rec1( now+1, n );
}
void rec2( int now, int x ) {
if( now == 0 ) {
// одоо байгаа тоо нь 0 гэсэн тул бид 0 хүртэл хэвлэсэн
// гэж үзэх тул энэ хүрээд зогсоно.
return;
}
// эсрэг тохиолдолд now нь 1-ээс их буюу тэнцүү ба бид өмнөх
// тоонуудыг хэвлэх ёстой тул now-1 гэж дуудна.
rec2( now-1, x );
// энэ тохиолдолд бид now-1 хүртэл хэвлэсний дараа энэ
// үйлдэл хийгдэх. тиймээс одоо now гэсэн тоогоо нэмж
// хэвлэнэ гэсэн үг юм.
cout << now << " ";
}
int main() {
/*
Рекурсив гэж юу вэ? Энэ нь өөрөө өөрийгөө дуудаж чаддаг функц юм. Жишээгээр
ойлгомжтой байх болов уу? Жишээ нь бид 1 ээс N хүртэл хэвлэмээр байлаа.
Мэдээж үүнийг хийхэд амархан. Бид while, эсвэл for ашиглаад үүнийг шийдэж
болно. Харин Рекурсив ашиглаад үүнийг хийвэл хэрхэн хийгдэх талаар.
1. Бид 1 гэсэн тоог хэвлээд дараа нь 2 гэсэн тоог хэвлэнэ. харин дараа нь
3 гэх мэт энэ нь N хүрээд зогсоно. Тэгвэл рекурсивийн зогсох нөхцөл нь
N гэсэн үг ба бид N-ээс ялгаатай K гэсэн тоог хэвлэсэн тохиолдолд 1-ээс
K хүртэл бүх тоог хэвлэсэн гэсэн үг ба K < N бага тул K+1 гэсэн тоог
хэвлэх ёстой ба. Үргэлжлүүлэн хэвлэх ёстой гэсэн үг юм. Харин K == N
нөхцөл биелбэл бид N хүртэлх бүх тоог хэвлэсэн гэсэн үг юм. Тиймээс
үүгээр зогсоно.
2. Бид N гэсэн тоог N-1 хүртэлх тоо хэвлэгдсэн гэж үзвэл үүний ард N гэсэн
тоогоо хэвлэхэд хангалттай гэсэн үг юм. Тэгвэл N хүртэл хэвлэхийн тулд
N-1 хүртэл хэвлэсэн байх ёстой. N-1-ыг хэвлэхийн тулд N-2 хүртэл хэвлэсэн
байх ёстой гэх мэт 2 гэсэн тоог хэвлэхийн тулд 1 гэсэн тоог хэвлэх хэрэгтэй
юм. Харин 1 гэсэн тоог хэвлэхийн тулд 0 хүртэл хэвлэх хэрэгтэй ба бид 0-ийг
хэвлэх ёсгүй тул энэ хүрээд зогсоно. Харин одоо 0 хүртэл хэвлэсэн. Иймээс
1-ийг хэвлэнэ. Ингэснээр 1 хүртэл хэвлэсэн. Иймээс 2-ыг хэвлэнэ. Ингэснээр
2 хүртэл хэвлэсэн. Энэ мэд бид N хүртэл хэвлэх юм.
Ер нь бол өөрийгөө дуудсаны дараа бичсэн юм нь тэр дуудсан хэсгийг зогсох буюу
бодоод дууссаны дараа хийгдэнэ гэсэн үг юм
*/
int n; cin >> n;
rec1( 1, n ); cout << endl;
rec2( n, n ); cout << endl;
return 0;
}