ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

recursive functions توابع بازگشتي23 آذرماه

 
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming
View previous topic :: View next topic  
Author Message
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Tue Dec 14, 2004 9:57 pm    Post subject: recursive functions توابع بازگشتي23 آذرماه Reply with quote

برنامه اي بنويسيد كه توسط تابعي به نام fact براي محاسبه فاكتوريل يك عدد صحيح مقدار n! را ( n را از ورودي بگيرد و ) محاسبه كند و در خروجي بنويسد :


#include <stion.h>
#include <conio.h>
long int fact(int);
main(){ int x;
   printf("Enter An Integer ");
   printf("value:");
   scanf("%d",&x);
   printf("\n fact(%d)=%d",x,fact(x));
   return 0; }
long int fact(int n){
   long int p=1;
   while(n>1){
      p*=n;
      n--;}
   return(p);  }

توابع بازگشتي ( recursive functions )
تابع بازگشتي را تابعي گوييم كه خود را صدا ميزند ( فراخواني ميكند ) و به خودش باز ميگردد . توضيحات متعاقبا داده خواهد شد .
پياده سازي :
تعريف مساله را به فرم بازگشتي روي كاغذ پياده سازي ميكنيم .
هر تعريف بازگشتي شامل حداقل دو بخش زير است :
الف) بخش بازگشتي ( خودفراخوان recursive )
ب) شرط خاتمه ( فراخوانيها )
مراحل فوق را براي برنامه فوق كه فاكتوريل بود طي ميكنيم :

1) n * ( n-1 ) !   , n>1
2) 1            , else

دو مرحله فوق مربوط به تابع !n است .
مثال) تابع فاكتوريل را به صورت بازگشتي پياده سازي كنيد .
long int  fact(int n) {
   if(n) return(n*fact(n-1));
return(1); }

trace تابع فوق را براي عدد سه انجام دهيد :

n   fact(n)
-----------------
3   3*fact(3-1)
2   2*fact(2-1)
1   1*fact(1-1)
 

مثال) اگر فرض كنيم n عددي زوج است تابعي پياده سازي كنيد بصورت بازگشتي كه مجموع اعداد زوج بين صفر و n را محاسبه كند .

1) n+s(n-2)   ,   n>0
2)sum=0   ,   n=0

int sum(int n) {
   if (n) return(n+sume(n-2));
return 0; }

حالات خاص :
الف) وقتي در بخش بازگشتي تعريف بيش از يك فراخواني از تابع داشته باشيم ( فراخواني ها تشكيل درخت k تايي ميدهند ) كه k تعداد فراخواني ها است .
مثال) بدون پياده سازي به زبان c بازاي n=5 مقدار f(n) صورت زير را بدست آوريد :

1) f(n-1)+f(n-2)   , n>1
2)n         , n<=1


          f(5)
         __/\____
    ____/        \_
   /               \
f(4)      +        2*f(3)
|                    \
|                     \
f(3)+2*f(2)           f(2)+2f(1)
|
|
f(2)+2*f(1)
|
|
f(1)+2*f(0)

ب) وقتي بيش از يك پارامتر داشته باشيم :

       1)f(n-2,m-1)   , m+n>0
f(n,m)=
       2)  m+n      , m+n<=0

مثال) مقدار تابع فوق را بازاي n=5 و m=3 بدست اوريد :

I. f(5,3)=f(3,2)-2
II.        f(3,2)=f(1,1)-1
III.               f(1,1)=f(-1,0)
IV.                        f(-1,0)=-1


Quote:

تمرين 1 ) پراسيجري بنويسيد كه يك رشته را بصورت معكوس در خروجي چاپ كند ( با تابع بازگشتي )
تمرين 2) تعريف بازگشتي ذكر شده در نمونه ب از حالات خاص را بصورت يك تابع پياده سازي كنيد .
تمرين 3) تابعي براي محاسبه k جمله اول سري فيبوناچي بنويسيد ( بصورت بازگشتي مجموع ارقام را نمايش دهد )
تمرين 4) سري(sin(x را بصورت يك تابع بازگشتي در خروجي بنويسيد k جمله اول انرا در خروجي بنويسيد و x را بگيرد و محاسبه كند .
sin(x)=x-(x^3/3!)+(x^5/5!)-...

Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum