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