递归调用

一: 什么是递归调用?

在调用一个函数的过程中 又出现直接或间接调用该 函数本身 , 称为函数的递归调用

该算法分为两步执行:  1:回推

            2:递推

 

二: 举列     用递归方法求 n!

分析:   n!  =  1    (n=0,1)

                = n * (n-1)!    n>1


 

C语言算法实现: 

 1 #include<stdio.h>
 2 int digui(int n)
 3 {
 4     int c; // c作为 存放  函数的返回值的变量
 5     if(n ==1||n ==0)
 6     {
 7         c =1;
 8     }
 9     else
10     {
11         c = n * digui(n-1);
12     }
13     return c;
14 }
15 void main()
16 {
17     int n ;
18     printf("请输入一个整数:");
19     scanf("%d",&n);
20     printf("n! = %d",digui(n));
21 }

 

根据调试,可以得知该方法的具体调用全过程,以下简述:

调用步骤为:  假设输入一个整数为:5

以下过程为  回推

则调用   digui(5),  此时转到  digui() 函数中执行

1: 因为 n =5, 所以执行 c = n *digui(n-1),  此时  c = 5 * digui(4)

2:执行digui(4) 函数,  此时 n =4 ,还是执行 c = n *digui(n-1),  此时 c = 4 * digui(3)

同理...

一直执行到 digui(1), 此时 n = 1,  将要执行 digui(1)函数,即 c = 1这句。  

到此  回推过程完毕。   

以下过程为  递推

当知道 c =1后,  当n =2 时,  c = 2 * digui(1)   得出 c = 2(即是 digui(2) = 2);

当n = 3时, c = 3* digui(2)   得出 c = 6 (即是 digui(3) = 6)

同理...

一直到 n = 5,   c = 5 * digui(4)   得出最终结果。  

函数结束。

 

具体流程,  调试一遍便知

 

 

附: C#实现

namespace digui
{
    class Program
    {
        public static  int Factorial(int n)
        {
            if (n == 1)
            {
                return 1;
            }
            else
            {
                return n * Factorial(n - 1);
            }
        }

        static void Main(string[] args)
        {
            Console.Write("请输入n的值:");
            int n = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("n!={0}", Factorial(n));
        }
    }
}

 

posted @ 2013-07-09 20:21  难念的经whh  阅读(211)  评论(0编辑  收藏  举报