اولا من فکر می کنم در خیلی از موارد نیازی به تابع بازگشتی نباشد.
چون خیلی محاسبات تابع بازگشتی به ذهن فشار می آورد به نظرم بهتر است ازش استفاده نشه.
البته قضیه دانشگاه فرق دارد و باید با روال آنها پیش رفت.
میشه از حلقه به راحتی جایگزین تابع بازگشتی استفاده کرد. و یا یک تابع ساده هم داخل حلقه حداکثر صدا زده بشه. هر کس هم که نظر مخالف داره بگه. من ذهنی این نظر را دادم و نه با امتحان با کد.
----------------------------------------------
اما
تابع بازگشتی:
برای فهم ساده تر ساختار تابع بازگشتی من پیشنهاد می کنم تابع به 3 قسمت تقسیم بشه.
قسمت اول قسمت بالایی.
قسمت میانی.
قسمت سوم قسمت پایینی.
در قسمت اول کدها موقع رفت تابع اجرا می شوند.
در قسمت میانی تابع خودش را صدا می زند و همچنین شرط صدا زدن در این قسمت قرار می گیرد. اگر شرط متغیری را بررسی می کند. کاهش یا افزایش آن متغیر هم جزو قسمت میانی حساب میشه.
در قسمت سوم کدها موقع بازگشت اجرا می شوند.
نکته مهم : باید حواسمان باشد که تابع تا ابد خود را صدا نزند. پس شرط صدا زدن خود تابع باید به دقت تنظیم بشود.
==================================
من عبارت زیر را در گوگل سرچ کردم:
کد:
"c programming"+"recursive function"
و اولین سایتی که جلب توجه می کنه همان ویکپدیا است:
http://en.wikipedia.org/wiki/Recursion_(computer_science)
با عناوین زیر:
کد:
1 Recursive algorithms
2 Recursive programming
2.1 Examples of recursively defined procedures (generative recursion)
2.1.1 Factorial
2.1.2 Fibonacci
2.1.3 Greatest common divisor
2.1.4 Towers of Hanoi
2.1.5 Binary search
2.2 Recursive data structures (structural recursion)
2.2.1 Linked lists
2.2.2 Binary trees
2.3 Recursion versus iteration
3 Tail-recursive functions
4 Order of function calling
4.1 Function 1
4.2 Function 2 with swapped lines
5 Direct and indirect recursion
6 See also
7 External links
8 References
===========================
و بعد به سایت زیر می رسیم:
http://www.cprogramming.com/tutorial/lesson16.html
که با کد شرح داده.
اولش این مقدمه را نوشته:
Recursion is a programming technique that allows the programmer to express operations in terms of themselves. In C++, this takes the form of a function that calls itself. A useful way to think of recursive functions is to imagine them as a process being performed where one of the instructions is to "repeat the process". This makes it sound very similar to a loop because it repeats the same code, and in some ways it is similar to looping. On the other hand, recursion makes it easier to express ideas in which the result of the recursive call is necessary to complete the task. Of course, it must be possible for the "process" to sometimes be completed without the recursive call. One simple example is the idea of building a wall that is ten feet high; if I want to build a ten foot high wall, then I will first build a 9 foot high wall, and then add an extra foot of bricks. Conceptually, this is like saying the "build wall" function takes a height and if that height is greater than one, first calls itself to build a lower wall, and then adds one a foot of bricks.
ساده ترین حالت اینه:
کد:
void recurse()
{
recurse(); //Function calls itself
}
int main()
{
recurse(); //Sets off the recursion
}
یعنی تابع با مین صدا شده و بعد تابع خودش را صدا زده.
البته برنامه بالا کراش می کنه. و قابل استفاده نیست.
برنامه بعدی اینه:
کد:
void doll ( int size )
{
if ( size == 0 ) // No doll can be smaller than 1 atom (10^0==1) so doesn't call itself
return; // Return does not have to return something, it can be used
// to exit a function
doll ( size - 1 ); // Decrements the size variable so the next doll will be smaller.
}
int main()
{
doll ( 10 ); //Starts off with a large doll (its a logarithmic scale)
}
اینجا شرط توقف صدا زدن گویا هست و تابع بازگشتی هم وقتی size - 1 را ارسال می کنه به بعدی نوعی تفریق است.
=========================
شرح تابع فاکتوریل با تابع بازگشتی در اینجا:
http://cprogramminglanguage.net/c-recursive-function.aspx