13.递归函数

13.函数-递归函数


13.1 知识点

基本概念

递归函数概念

递归函数是指让函数自己调用自己的一种特殊函数形式。

一个正确的递归函数必须要遵守的规则

  • 必须有结束递归调用的条件。
  • 用于结束递归调用条件判断的条件必须能够改变,以达到停止的目的。

语法结构

// static void Fun()
// {
//     // 用于条件判断的条件必须改变,能够达到停止的目的
//     if (false)
//     {
//         // 结束调用的条件
//         return;
//     }
//     // 自己调用自己
//     Fun();
// }

实例

主函数外 class语句块内

// 用递归函数打印出 0 到 10
static void Fun(int a)
{
    // 结束条件
    if (a > 10)
    {
        return;
    }
    // 完成要求:打印
    Console.WriteLine(a);
    // 完成一个递归的变化,作为条件的判断
    ++a;
    // 构造了一个递归,自己调用自己
    Fun(a);
}

主函数内

Fun(0); // 打印出了 0 到 10

13.2 知识点代码

using System;

namespace Lesson11_递归函数
{
    class Program
    {
        #region 知识点一 基本概念
        //递归函数 就是 让函数自己调用自己
        //一个正确的递归函数必须要遵守的规则
        // 1.必须有结束递归调用的条件
        // 2.用于结束递归调用条件判断的 这个条件 必须能改变到 能够达到停止的目的

        //语法结构
        //static void Fun()
        //{
        //     //用于条件判断的 这个条件 必须改变 能够达到停止的目的
        //    if( false )
        //    {
        //      //结束调用的条件
        //        return;
        //    }
        //    //自己调用自己
        //    Fun();
        //}


        #endregion

        #region 知识点二 递归函数实例
        //主函数外 class语句块内

        //用递归函数打印出 0到10
        static void Fun(int a)
        {
            //第四步:结束条件
            if( a > 10 )
            {
                return;
            }
            //第二步:完成要求 打印
            Console.WriteLine(a);
            //第三部:完成一个 递归的变化 作为我们条件的判断
            ++a;
            //第一步:构造了一个递归 自己调用自己
            Fun(a);
        }

        #endregion

        static void Main(string[] args)
        {
            Console.WriteLine("递归函数");

            #region 知识点二 递归函数实例
            //主函数内
            Fun(0);//打印出了0-10
            #endregion
        }
    }
}

13.3 练习题

使用递归的方式打印0~10

主函数外 class 语句块内

static void Fun(int a)
{
    if (a > 10)
    {
        return;
    }
    Console.WriteLine(a);
    ++a;
    Fun(a);
}

主函数内

Fun(0); // 打印出了0-10

传入一个值,可以递归求该值的阶乘并返回5的阶乘

主函数外 class 语句块内

// 5! = 1*2*3*4*5
// 5! = 5*4*3*2*1
static int Fun2(int num)
{
    if (num == 1)
    {
        return 1;
    }
    return num * Fun2(num - 1);
    // 5 * Fun2(4) = 5 * 4 * 3 * 2 * 1
    // 4 * Fun2(3) = 4 * 3 * 2 * 1
    // 3 * Fun2(2) = 3 * 2 * 1
    // 2 * Fun2(1) = 2 * 1
    // 1
}

主函数内

Console.WriteLine(Fun2(5)); // 输出:120
// 5! = 1*2*3*4*5;

使用递归求 1! + 2! + 3! + 4! + ….. + 10!

主函数外 class 语句块内

// 阶乘(1) + 阶乘(2) + 阶乘(3).......+阶乘(10)
// 阶乘(10) + 阶乘(9) + 阶乘(8) + ........ 阶乘(1)
static int Fun3(int num)
{
    if (num == 1)
    {
        return Fun2(1);
        //return 1;
    }
    // 阶乘(10) + 阶乘(9) + 阶乘(8) + ........ 阶乘(1)
    return Fun2(num) + Fun3(num - 1);
    // 阶乘(10) + Fun3(9) 阶乘(10) + 阶乘(9) .....+  阶乘(2) + 阶乘(1)
    // 阶乘(9) + Fun3(8)  阶乘(9) + 阶乘(8) .....+  阶乘(2) + 阶乘(1)
    // 阶乘(8) + Fun3(7)  阶乘(8) + 阶乘(7) .....+  阶乘(2) + 阶乘(1)
    //.....
    // 阶乘(2) + Fun3(1)  阶乘(2) + 阶乘(1)
    // 阶乘(1)
}

主函数内

Console.WriteLine(Fun3(10)); // 输出:4037913

一根竹竿长100m,每天砍掉一半,求第十天它的长度是多少

主函数外 class 语句块内

// 一是长度 二是天数
static void Fun4(float length, int day = 0)
{
    length /= 2;
    // 第十天砍了过后的长度 
    if (day == 10)
    {
        Console.WriteLine("第十天砍后竹子长{0}米", length);
        return;
    }
    ++day;
    Fun4(length, day);
}

主函数内

Fun4(100); // 第十天砍后竹子长0.048828125米

不允许使用循环语句、条件语句,在控制台中打印出1-100这100个数(提示:递归+短路)

主函数外 class 语句块内

static bool Fun5(int num)
{
    // 1-99进来,逻辑表达式第一个不符合,会进第二个逻辑表达式的递归
    // 100进来,逻辑表达式第一个就符合,不会进第二个逻辑表达式的递归
    Console.WriteLine(num);
    return num == 100 || Fun5(num + 1);
}

主函数内

Fun5(

1); // 打印出了1-100

13.4 练习题代码

using System;

namespace Lesson11_练习题
{
    class Program
    {
        #region 练习题一
        //使用递归的方式打印0~10

        //主函数外 class语句外内
        static void Fun(int a)
        {
            if( a > 10 )
            {
                return;
            }
            Console.WriteLine(a);
            ++a;
            Fun(a);
        }

        #endregion

        #region 练习题二
        //传入一个值,可以递归求该值的阶乘 并返回5的阶乘

        //主函数外 class语句外内

        //5! = 1*2*3*4*5
        //5! = 5*4*3*2*1;
        static int Fun2(int num)
        {
            if( num == 1 )
            {
                return 1;
            }
            //return 5*4*3*2*1;
            return num * Fun2(num - 1);
            // 5 * Fun2(4) = 5 * 4 * 3 * 2 * 1
            // 4 * Fun2(3) = 4 * 3 * 2 * 1
            // 3 * Fun2(2) = 3 * 2 * 1
            // 2 * Fun2(1) = 2 * 1
            // 1
        }
        #endregion

        #region 练习题三
        //使用递归求 1! + 2! + 3! + 4! + ..... + 10!

        //主函数外 class语句外内

        // 阶乘(1) + 阶乘(2) + 阶乘(3).......+阶乘(10)
        // 阶乘(10) + 阶乘(9) + 阶乘(8) + ........ 阶乘(1)
        static int Fun3(int num)
        {
            if( num == 1 )
            {
                return Fun2(1);
                //return 1;
            }
            // 阶乘(10) + 阶乘(9) + 阶乘(8) + ........ 阶乘(1)
            return Fun2(num) + Fun3(num - 1);
            // 阶乘(10) + Fun3(9) 阶乘(10) + 阶乘(9) .....+  阶乘(2) + 阶乘(1)
            // 阶乘(9) + Fun3(8)  阶乘(9) + 阶乘(8) .....+  阶乘(2) + 阶乘(1)
            // 阶乘(8) + Fun3(7)  阶乘(8) + 阶乘(7) .....+  阶乘(2) + 阶乘(1)
            //.....
            // 阶乘(2) + Fun3(1)  阶乘(2) + 阶乘(1)
            // 阶乘(1)
        }
        #endregion

        #region 练习题四
        //一根竹竿长100m,每天砍掉一半,求第十天它的长度是多少(从第0天开始)

        //主函数外 class语句外内

        // 一是长度 二是天数
        static void Fun4(float length, int day = 0)
        {
            length /= 2;
            //第十天砍了过后 的长度 
            if (day == 10)
            {
                Console.WriteLine("第十天砍后竹子长{0}米", length);
                return;
            }
            ++day;
            Fun4(length, day);
        }
        #endregion

        #region 练习题五
        //不允许使用循环语句、条件语句,在控制台中打印出1-100这100个数(提示:递归+短路)

        //主函数外 class语句外内
        static bool Fun5(int num)
        {
            //1-99进来 逻辑表达式第一个不符合 会进第二个逻辑表达式的递归
            //100进来 逻辑表达式第一个就符合 不会进第二个逻辑表达式的递归
            Console.WriteLine(num);
            return num == 100 || Fun5(num + 1);
        }
        #endregion

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            #region 练习题一
            //主函数内
            Fun(0);//打印出了0-10
            #endregion

            #region 练习题二
            //主函数内
            Console.WriteLine(Fun2(5));//120
            //5! = 1*2*3*4*5;
            #endregion

            #region 练习题三
            //主函数内
            Console.WriteLine(Fun3(10));//4037913
            #endregion

            #region 练习题四
            //主函数内
            Fun4(100);//第十天砍后竹子长0.048828125米
            #endregion

            #region 练习题四
            //主函数内
            Fun5(1);//打印出了1-100
            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏