递归 —— 能进则进,不进则退

本文深入探讨了递归算法的概念、三要素及其注意事项,并通过实例展示了递归在进制转换问题中的应用。重点阐述了递归的终止条件、效率限制以及在实际编程中的实现方式。

一: 概念
递归,说白了就是直接或者间接的调用自己的一种算法。它是把求解问题转化为规模较小的子问题,然后通过多次递归一直到可以得出结果
的最小解,然后通过最小解逐层向上返回调用,最终得到整个问题的解。总之递归可以概括为一句话就是:“能进则进,不进则退”。

二:三要素
<1> 递归中每次循环都必须使问题规模有所缩小。
<2> 递归操作的每两步都是有紧密的联系,如在“递归”的“归操作时”,前一次的输出就是后一次的输入。
<3> 当子问题的规模足够小时,必须能够直接求出该规模问题的解,其实也就是必须要有结束递归的条件。

三: 注意
<1> 前面也说了,递归必须要有一个递归出口。
<2> 深层次的递归会涉及到频繁进栈出栈和分配内存空间,所以运行效率比较低,当问题规模较大时,不推荐使用。
<3> 在递归过程中,每次调用中的参数,方法返回点,局部变量都是存放在堆栈中的,如果当问题规模非常大时,容易造成堆栈溢出。

 

class Factorial
{
static void Func()
{
while (true)
{
Console.WriteLine("\n请输入一个求阶乘的一个数:");
int num = int.Parse(Console.ReadLine());
Console.WriteLine("\n阶乘的结果为:" + Fact(num));
}
}

static int Fact(int aNum)
{
if (aNum == 1)
{
return 1;
}
return aNum * Fact(aNum - 1);
}
}

 

/// <summary>
/*
*”进制转换问题“,比如将”十进制“转化为”二进制“。
思路:采用除2取余法,取余数为相应二进制数的最低位,然后再用商除以2得到次低位.......直到最后一次相除商为0时得到二进制的最高位,
比如(100)10=(1100100)2, 仔细分析这个问题,会发现它是满足”递归“的三要素的,
① 进制转换中,数据规模会有所缩小。
② 当商为0时,就是我们递归的出口。
所以这个问题我们就可以用递归拿下。
*/
/// </summary>
class Decimalism
{
static void Main()
{
Console.WriteLine("请输入一个十进制数:");

int num = int.Parse(Console.ReadLine());

string result = string.Empty;

Console.WriteLine("转化的二进制为:" + ConvertToBinary(ref result, num));

Console.ReadLine();
}

private static string ConvertToBinary(ref string aResult, int aNum)
{
//递的过程
if (aNum == 0)
{
return string.Empty;
}
else
{
ConvertToBinary(ref aResult, aNum / 2);
}

//归的过程
return aResult += (aNum % 2);
}
}

转载于:https://www.cnblogs.com/ShaYeBlog/archive/2012/08/11/2633561.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值