سلام
می خواستم موضوع توابع بازگشتی رو در زبان
Pascal و زبان C/C++ بذارم
در Pascal رو داخل دلفی
اما C/C++ رو تو محیط Dos می نویسم (C++ ver 5. 02)
چون C/C++ . Net رو نصب شده رو سبستمم ندارم
امیدوارم به دردتون بخوره
Printable View
سلام
می خواستم موضوع توابع بازگشتی رو در زبان
Pascal و زبان C/C++ بذارم
در Pascal رو داخل دلفی
اما C/C++ رو تو محیط Dos می نویسم (C++ ver 5. 02)
چون C/C++ . Net رو نصب شده رو سبستمم ندارم
امیدوارم به دردتون بخوره
سلام
اولش یه تعریف از تابع بازگشتی
خیلی ساده:تابعی که کار های بازگشتی و تکراری
رو با صدا زدن خودش انجام بده
مثلا فاکتوریل factorial یعنی ضرب یه عدد در
عدد قبلیش تا اینکه به یک(1) برسیم
کار تکراری و قابل پیاده سازی به وسیله تابع برگشتی
ضرب عدد در عدد قبلی
سلام
آموزش1:فاکتوریل
در Pascal
اول تابع زیر رو در private قسمت تعریف کنید
حالا برای بدنه تابعکد:Function factorial (MyNumber:integer):Longint;
کد:if MyNumber=1 then
Result:=1
else
Result:=factorial(MyNumber-1)*MyNumber;
دو تا Edit رو فرم بذارین و یه Button
حالا توی رویداد Click مربوط به Button بنویسید
حالا در C/C++کد:if StrToInt(Edit1.Text)>0 then
Edit2.Text:=IntToStr(factorial(StrToInt(Edit1.Text)))
else
Edit2.Text:='0';
محیط C++ تحت داس
برای زبان C هم تغییرات کمی لازمهکد:#include<stdio.h>
#include<fstream.h>
#include<conio.h>
long int factorial(int MyNumber);
void main()
{
int a;
cout<<"Enter Number: ";
cin>>a;
cout<<endl<<"Factorial is "<<a<<" : "<<factorial(a);
getch();
}
long int factorial(int MyNumber)
{
if(MyNumber==1)
return 1;
else
return factorial(MyNumber-1)*MyNumber;
}
تبدیل Cout به Printf و ....
ولی ساختار همینه
امیدوارم به درتون بخوره
هر جا سوالی بود در خدمتم
اگه بلد باشم جواب می دم
بازم گير مد تشكر هستيم
تششششششششششششششششكر
سلام
ممنون ، تاپیک جالبی رو باز کردی ...
موفق باشی ...
سلام
آموزش 2 :
چاپ دنباله
n-…-5-4-3-2-1-2-3-4-5-…-n
ابتدا در Delphi
تابع Revers رو در قسمت private تعریف می کنیم
در بدنه تابع می نویسیمکد:procedure Revers(MyNumber:integer);
endکد:if (MyNumber=1) then
Edit2.Text:=Edit2.Text+'1-'
else
begin
Edit2.Text:=Edit2.Text+IntToStr(MyNumber)+'-';
Revers(MyNumber-1);
Edit2.Text:=Edit2.Text+IntToStr(MyNumber)+'-';
دوتا Edit و یه Button روی فرم می ذاریم
داخل Click مربوط به Button می نویسیم
تابع در C/C++کد:Edit2.Clear;
if StrToInt(Edit1.Text)<1 then
Edit2.Text:='0'
else
Revers(StrToInt(Edit1.Text));
با یه خورده تغییر در C هم می تونین بنویسید.کد:#include<stdio.h>
#include<fstream.h>
#include<conio.h>
void revers(int MyNumber);
void main()
{
int a;
cout<<"Enter Number: ";
cin>>a;
cout<<endl<<"Revers is : ";
revers(a);
getch();
}
void revers(int MyNumber)
{
if(MyNumber==1)
cout<<"1-";
else
{
cout<<MyNumber<<"-";
revers(MyNumber-1);
cout<<MyNumber<<"-";
}
}
امیدوارم به دردتون بخوره
هر جا مشکلی بود در خدمتم
اگه بتونم جواب می دم
سلام
منتظر توابع شما هم هستیم
چندتا دیگه هم نوشتم که می ذارمنقل قول:
سلام
ممنون ، تاپیک جالبی رو باز کردی ...
موفق باشی ...
بهترین مبحث برنامه نویسی بعد از Database به نظرمن
توابع بازگشتی هستن. یعنی این توابع یه چیز دیگه ان
فقط اینو در باره توابع بازگشتی بگم که
تمام تکنبک های برنامه نویسی ( غیر ازdatabase) یه
طرف ، توابع بازگشتی هم همون طرف.
آموزش3:بدست اوردن n امین عدد دنباله فیبوناچی
در Pascal
اول تابع زیر رو در private قسمت تعریف کنید
بعدش تابع زیر رو در public قسمت تعریف کنیدکد:function fibonachiPrivate(Count,MyCounter,a,b: integer): Longint;
حالا برای بدنه fibonachiPrivate تابعکد:function fibonachi(count:integer):longint;
و برای تابع fibonachiکد:if Count=MyCounter then
Result:=a+b
else
Result:=fibonachiPrivate(Count,MyCounter+1,b,a+b)
دو تا Edit رو فرم بذارین و یه Buttonکد:if ((count=1)or(count=2))then
Result:=1
else
Result:=fibonachiPrivate(count,3,1,1)
حالا توی رویداد Click مربوط به Button بنویسید
دقت کنید دو تا تابع تعریف شده ، برای حفظ امنیت برنامه هست(اگر بخواهین اینا راکد:Edit2.Text:=IntToStr(fibonachi(StrToInt(Edit1.Text)))
توی یه کلاس به مار ببرید)
کاربر نباید به توابع اصلی شما دسترسی داشته باشد
و باید یه تابع واسط تعریف شود
حالا در C/C++
محیط C++ تحت داس
برای زبان C هم تغییرات کمی لازمهکد:#include<stdio.h>
#include<fstream.h>
#include<conio.h>
long int fibonach(int,int=3,int=1,int=1);
void main()
{
int a;
cout<<"Enter Number: ";
cin>>a;
cout<<endl<<"Fibonachi Number is : ";
if ((a==1) || (a==2))
cout<<1;
else
cout<<fibonach(a);
getch();
}
long int fibonach(int count,int MyCount,int a,int b)
{
if (count==MyCount)
return a+b;
else
return fibonach(count,MyCount+1,b,a+b);
}
تبدیل Cout به Printf و ....
ولی ساختار همینه
امیدوارم به درتون بخوره
چون توابع رو خودم می نویسم ممکن بهینه تر هم پیدا بشه
اما قبل از قرار دادن تست شون میکنم
هر جا سوالی بود در خدمتم
اگه بلد باشم جواب می دم
برنامه نویسی بازگشتی بزرگترین مشکلی که داره استفاده بیش از اندازه از حافظه هست که باعث کند شدن اجراهای متوالی این نوع توابع میگردد. ولی یکی از مزیتهای این نوع توابع راحتی تبدیل فرمولهای ریاضی به کد برنامه نویسی و خوانایی کد میباشد
کد پیدا کردن GCD بوسیله توابع بازگشتی:
کد:#include <stdio.h>
int GCD(int n,int m);
void main(){
int m,n;
printf("enter two number?\n");
scanf("%d",&m);
scanf("%d",&n);
printf("the GCD is : %d", GCD(n,m));
}
int GCD(int n,int m){
if ((n >=m ) && (n%m == 0))
return m;
else if (n <m)
return GCD(m,n);
else
return GCD(m,n%m);
}
این قسمت هم باید در درون تابع فیبو قرار بگیرد (لطفاً به تعریف کلی توابع برگشتی دقت بیشتری کنید).نقل قول:
کد:if ((a==1) || (a==2))
cout<<1;
else
cout<<fibonach(a);
در ضمن اگر اشتباه نکنم سری فیبو از 0 شروع میشه
کد:if (a == 1)
return 0;
else if (a == 2)
return 1;
سلام این دفعه حضور دوستان انجمن C
برای این که آموزش بهتر باشه و انسجام بیشتری بین مطالب
باشه این دوتا آموزش رو در یک تاپیک زدم
اگه سوالی داشتین می تونین توی این تاپیک بپرسین
اگه بلد بودم جواب بدم
چون C#.Net و C++.Net رو روی سیستمم ندارم
نمی تونم توابع رو برای .Net بنویسیم اما فکر نکنم
بردن این توابع از C++ تحت داس به محیط .Net کاری
داشته باشه
سلام
در مورد توابع بازگشتی بگم که بعضی
از مسائل فقط با توابع بازگشتی قابل حل هستن
معروف ترین این توابع : برج های هانوی هستن هر دو versionشم
سلام این هم تابع بازگشتی برای برجهای هانوی تو سی
کد:#include <stdio.h>
#include <conio.h>
void tow_hanoi(int n,char peg_A,char peg_B,char peg_C);
void main(){
int n;
printf("enter the number of disks\n");
scanf("%d",&n);
tow_hanoi(n,'A','B','C');
getch();
}
void tow_hanoi(int n,char peg_A,char peg_B,char peg_C){
if (n<=0)
printf("number of disk must be positive\n");
else if(n==1)
printf("\nmove from %c to %c",peg_A,peg_C);
else{
tow_hanoi(n-1,peg_A,peg_C,peg_B);
tow_hanoi(1,peg_A,peg_B,peg_C);
tow_hanoi(n-1,peg_B,peg_A,peg_C);
}
}
سلام
netspc عزیز
از توجه هتون ممنون
گفتم که
نقل قول:
چون توابع رو خودم می نویسم ممکن بهینه تر هم پیدا بشه
اما قبل از قرار دادن تست شون میکنم
تا اونجای که من می دونم از 1 شروع میشهنقل قول:
در ضمن اگر اشتباه نکنم سری فیبو از 0 شروع میشه
اگه با 0 هم شروع بشه تفاوت چندانی نمی کنه تابع جواب می ده
چندتا تابع ریاضی دارم می نویسم که می ذارم
منتظر توابع سایر دو ستان نیز هستیم
آموزش4:برعکس کردن رشته
در Pascal
اول تابع زیر رو در private قسمت تعریف کنید
حالا برای بدنه revers تابع قبلش یه متغییر به نام MyCha; از نوع Char تعریف کنیدکد:function revers(MyString:string;StartChar,EndChar:Integer):string;
دو تا Edit رو فرم بذارین و یه Buttonکد:var
MyChar:Char;
begin
if ((StartChar=EndChar) or (StartChar>EndChar))then
Result:=MyString
else
begin
MyChar:=MyString[StartChar];
MyString[StartChar]:=MyString[EndChar];
MyString[EndChar]:=MyChar;
Result:=revers(MyString,StartChar+1,EndChar-1);
end;
end;;
حالا توی رویداد Click مربوط به Button بنویسید
حالا در C/C++کد:Edit2.Text:=revers(Edit1.Text,1,StrLen(PChar(Edit1.Text)));
محیط C++ تحت داس
[PHP][/PHP]کد:#include<stdio.h>
#include<fstream.h>
#include<conio.h>
char * revers(char MyString[30],int StatrChar,int EndChar);
void main()
{
char a[30];
cout<<"Enter String: ";
gets(a);
cout<<endl<<"Revers is : ";
puts(revers(a,0,strlen(a)-1));
getch();
}
char * revers(char MyString[],int StatrChar,int EndChar)
{
if ((StatrChar==EndChar)||(StatrChar>EndChar))
return MyString;
else
{
char MyChar;
MyChar=MyString[StatrChar];
MyString[StatrChar]=MyString[EndChar];
MyString[EndChar]=MyChar;
return revers(MyString,StatrChar+1,EndChar-1);
}
}
برای زبان C هم تغییرات کمی لازمه
تبدیل Cout به Printf و ....
ولی ساختار همینه
امیدوارم به درتون بخوره
چون توابع رو خودم می نویسم ممکن بهینه تر هم پیدا بشه
اما قبل از قرار دادن تست شون میکنم
هر جا سوالی بود در خدمتم
اگه بلد باشم جواب می دم
واقعآ دستتون درد نکنه...
اگه میشه برنامه فیبوناچی را بصورت ران شده بزارین تا من تو دلفی 7 اجرا کنم... چو ن با تیکه دستورهای قبلی نتونستم خودم ردیفش کنم... متشکرم
با سلام
میشه این برنامه رو ردیابی و تریس کنید و توضیح بدید.(مرحله به مرحله)
برنامه ای که ذو عدد از ورودی خوانده هریک از ارقام ان را در یک سطر چاپ کنه. اگه عدد کوچکتر از 10 باشه ان عدد را در خروجی چاپ کنه و تابع به برنامه فراخوانی بگرده.
کد:#include <stdio.h>
#inclide <conio.h>
void write_v(int);
int main()
{
int x;
clrscr();
printf("enter an number");
scanf("%d",&x);
write_v(x);
getche();
return 0;
}
void write_v(int x)
{
if (x<10)
printf("%d\n",x);
else{
write_v(x/10);
printf("%d\n",x%10);
}
}
1. دوست عزيز اسن تالاز مربوط به دلفي است. اگه جاي ديگه اين سوال رو ميپرسيدين بهتر بود.
2. خوشحالم كه يك نفر رو ديدم كه سرچ ميكنه و به همين دليل با كمال ميل توضيحات رو خدمتتون ميدم :
در ابتداي برنامه كه كاملا واضح است و برنامه يك عدد رو ميگيره.
در ادامه از تابع Wirte_V براي نمايش روي مونيتور استفاده ميكنه.
وقتي عدد ورودي وارد اين تابع ميشه چك ميكنه ببينه كه آخرين عدد هست يا نه. وقتي تقسيم يك عدد صحيح بر 10 مقدار صفر باشه و يا اينكه خود عدد كمتر از 10 باشه، يعني آخرين عدد موجود هست.
اگر يك عدد بزرگتر باشه مقدار تقسم اون بر 10 باعث ميشه كه يك رقم از سمت راست آن عدد كم بشه.
به دليل اينكه تابع بازگشتي قبل از فرمان Printf قرار گرفته، اين تابع تا زماني كه به اولين رقم برسيد تكرار ميشه. و بعد از اون چون قبلا تمام فرايند تحليل صورت گرفته تمامي اعداد پشت هم نمايش داده ميشه.
اميدوارم كه مطلب رو درست تونسته باشم توضيح بدم.
ولي اگه مشكلي بود، بگو تا يك عدد رو برات توي برنامه تريس كنم.
موفق باشي.
با سلام دوست عزیز ممنون خوب بود ولی اگه میشه با یه عدد توضیح بده که کامل بیافته!
با تشکر
فرض كن عدد 4251 وارد شده.
بنابر اين در مرحله اول Write_V(4251)i اجرا ميشه. داخل اين فانكشن برسي ميشه كه عدد از 10 كوچيكتر نيست. بنابراين عدد بر 10 تقسيم ميشه و دوباره به فاكنشن لينك ميشه. عدد دوم 425 و عدد سوم 42 و عدد چهارم 4 است. وقتي به عدد آخر ميرسه چون از 10 كوچكتره چاپش ميكنه.
بعد يك مرحله به عقب بر ميگرده. يعني عدد 42. باقيمانده اين عدد بر 10 عدد 2 هست كه اونو چاپ ميكنه و يك مرحله ميره عقب و براي عدد 425 و 4251 هم باقيمانده ها رو بر 10 مينويسه.
به اين ترتيب تمام ارقام زيدر هم نوشته ميشن. البته دليل زير هم نوشته شدن آن نيز استفاده از n/ هست.
موفق باشي.
البته دوست عزیزم مرد مباح کامل توضیح دادند اما یه توضیح اضافی هم میدم که فکر کنم مفید باشه
چند روز پیش یکی از دوستان در مورد پشته (stack) پرسیدند. یکی از کاربردهای پشته در انجام چنین مواردی هست
شما اگر دقیقا رفتار کامپایلر رو در زمان اجرا، روی کاغذ پیاده کنید و با ساختار پشته آشنا باشید به راحتی میتونید به کاری که این کد انجام میده پی ببرید
موفق باشید
با سلام خدمت دوستان
من می خواستم در مورد برنامه زیر در زبان c که سری فیبوناچی را تولید میکند توضیحاتی از قبیل ردیابی خطی برنامه در قسمت توابع بازگشتی بدهید.
//fibronachi
#include<conio.h>
#include<stdio.h>
int fib(int n);
int main()
{
int n;
scanf("%d",&n);
printf("%d",fib(n));
getch();
return 0;
}
int fib(int n)
{
if(n==2||n==1)
return 1;
return fib(n-1)+ fib(n-2);
}
:40:
mamnooon....
kheyli be dardam khord:11: