برنامه بعدی برنامه ایی هست که بازم الگوریتم بازگشتی داشته و تعداد ارقام عدد ورودی رو مخص میکنه....
#include<iostream.h>
#include<stdio.h>
int Number(int);
int i=1;
int main(){
int a;
cout<<"Enter A Number\n";
cin>>a;
cout<<"Number Of Digit is="<<Number(a)<<"\n";
return 0;
}
int Number(int a){
if(a<10) return i++;
else {
a=a/10;
i++;
return(Number(a));
}
}
برنامه بعد بازم مفهومی ضرب گونه داره با این تفاوت که الگوریتم ضرب هست ولی بازگشتی که توانایی ضرب رو در شرایطی که یکی از عملوند ها منفی یا هردو منفی باشند رو داره....همون طور که میدونید برنامه های بازگشتی در واقع یک خود فراخوانی است رو پشته سیستم و از پشته سیستم استفاده میکنه..و به این نکته هم توجه داشته باشید که هزینه اجرای برنامه هایی که توسط الگوریتم های بازگشتی نوشته میشه زیادتر از همون برنامه به روش غیر بازگشتیه ...از قدیم گفتن اگه راست میگی یه مثلا بیار
خوب من میخوام دو الگوریتم رو بررسی کنم که به یک صورت مساله اشاره داره اونم الگریتم معروف دنباله فیبوناچی هستش ...
توضیح برا اونایی که نمیدونن فیبو ناچی چیه...
دنباله ایی ریاضیه هستش که فرمولش انه
Fn=F(n-1)+F(n-2)
که در علم کامپیوتر و ریاضی کاربرد زیادی داره...
به خاطر انکه همیشه دوست دارم اصل صداقت رو رعایت کنم ...به این نکته توجه داشته باشید که مطالبی رو که از این به بعد نقل میکنم راجع به دنباله فیبوناچی از کتاب طراحی الگوریتم ها نوشته ریچارد نیپولیتانه ترجمه پدر کامپیوتر ایران =جعفر نژاد
به الگوریتم زیر که بازگشتی فیبوناچی هستش توجه کنید
Int fib(int n){
If(n<=1)
Return n;
else
return fib(n-1)+fib(n-2);
}
مثلا فرض کنید ما عدد 5 را برای بدست آوردن جمله پنجم فیبوناچی در برنامه ایی به تابع بازگشتی بالا می فرستیم...
تابع احتیاج به محاسبه تابع به ازای ورودی 4 و 3 داره و.....یعنی مقادری تکراری تولید میشه که این زیاد خوب نیست مثلا
طبق کتاب این الگوریتم برای محاسبه جمله 200 ام به 4*10000000000000سال زمان احتیاج داره تا اجرا بشه و این یعنی فاجعه.......
ولی الگوریتم ساده دیگه ایی رو کتاب برای این مساله اورده که ر مبنای آرایه نوشته و پایه ریزی شده که جملات تکراری تولید نشده و از جملات ماقبل که در آرایه ذخبره شده ا ستفاده میکنه...که به قرار زیره
:
Int fib(int n){
Int I;
Int f[n];
F[0]=0;
If(n>0){
F[1]=1;
For(i=2;i<=n;i++)
F[i]=f[i-1]+f[i-2];
}
Return f[n];
}
و این الگوریتم جدید برای همان جمله 200ام با شرایط مساوی به 201 نانو ثانیه زمان احتیاج داره...
ولی این یکی از ایراد های وارده به این نوع الگوریتم هاست که عموما درک راحت تری دارند نسبت به الگوریتم های مشابه...
حالا بحث مربوط به حافظه دیگه بماند حاش نیست.....و توسط توابع صف و پشته که خودمان مینویسیم میتونیم تا حدودی با
این مشکل مقابله کنیم...
ولی در کل این نتیجه گیری منه که برای باز کردن ذهن برنامه نویسان و رشدذهنی ورزش خوبیه....
و الان بعد از سالها یاد حرف استاد ترم اول دانشگاه می افتم که میگفت هر برنامه ایی رو میشه بازگشتی نوشت...
در ادامه بازم راجع به مثال هایی از برنامه های بازگشتی که در حد سواد خودم بوده وبرای درس ساختمان های داده نوشته ام
توجه کنید...
برنامه توان به صورت بازگشتی
:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
float Power(int,int);
int main(){
system("cls");
int a,b;
cin>>a>>b;
cout<<a<<"^"<<b<<"="<<Power(a,b)<<"\n\n\n\n\n\n\n";
return 0;
}
float Power(int a,int b){
if(b>=0){
if(b==0 ||a==1) return 1;
else return (a*Power(a,b-1));
}
if(b<0){
b=-b;
return(1/Power(a,b));
}
}
برنامه عدد مغلوب
:
#include<iostream.h>
#include<stdio.h>
int ReverceNumber(int);
int b;
int main(){
int a;
cout<<"Enter A Number\n";
cin>>a;
ReverceNumber(a);
return 0;
}
int ReverceNumber(int a){
if(a<10){
cout<<a;
return a;
}
if(a==0) return 0;
else {
b=a%10;
cout<<b;
a=a-b;
a=a/10;
return(ReverceNumber(a));
}
}
در آخر هم باز ممنونم از کسانی که این بحث رو باز کردند تا فرستی برای تجدید خاطره پیش اومد....
اگر هم کم و کاستی به بزر گی خودتون ببخشید...حد و سواد من همین قدر بود...
خدایا در آغاز با نام تو شروع کردیم و در ضمن در دل یاد تو را می پروراندیم که دیدیم در آخر جز تو کسی برایمان نمانده است... یا حق