白内障,浅谈什么是递归算法,云闪付

频道:科研发现 日期: 浏览:313

1 导言

程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛运用。一个办法或函数在其界说或阐明中有白内障,浅谈什么是递归算法,云闪付直接或直接调用自身的一种办法,它一般把一个大型杂乱的问题层层转化为一个与原问题类似的规划较小的问题来求解,递归战略只需少数的程序就可描绘出解题进程所需求的屡次少女暑假就医回忆录重复核算,大大地减少了程序的代码量。

例如求和问题:若要求解S100 = 1 + 2 山西永禄村+ 3 + 4 + …. + 100的值,经过循环的办法代码如下:

int sum = 0;
for (int i = 1; i <= 100; i++) {
sum = sum + i;
}

经过递归办法是怎么求解呢?由 **1 + 2 + 3 + 4 + …. + 100 **能够分解为 ( 1 + 2 + 3 + 4 + …. + 99) + 100,能够看出

S100 = S99 + 100,能够得出 Sn = Sn-1 + n。经过递归的办法代码如下:

public int sum(int n) {
if (n == 1) {
return 1;
} else {
return sum(n - 1) + n;
}
}白内障,浅谈什么是递归算法,云闪付

经过递归代码能够看出,sum() 办法中又调用了其自身,仅仅将传入的参数发作改动。这种程序调用自身的办法便是递归。

2 运用场景

什么样的问题才能够运用递归的办法求解呢?构成递归需求具有两个条件:

(1)子问题与原始问题为相同的工作,二者的求解办法是相同的,且子问题王太利比原始问题更易求解。

(2)递归不能无限制地调用自身,必须有个递归出口。递归出口对应的景象相对简略,能够化简为非递归情况处理。

3 实例

3.1 斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多斐波那契(Leonardoda Fibon风流情妇acci)以兔子繁衍为比如而引进,故又称为“兔子数列”,指的t34坦克是这样一个数列:

1、1、2、3、5、8、13、21、34、……

在数学上,斐波纳契数列以如下被以递推的办法界说:

F(1)=1,F(2)=1,,F(n) = F(n-1) + F(n-2)(n>=3,n∈N*)

问题剖析:

斐波那契数列的关于原问题F(n)的求解能够转为羊毛衫缩水了怎么办对F(n卡巴斯基-1)、F(n-2)两个子问题的求解,故契合条件(1)。由F(1)=1,F(2)=1,能够得出斐波那契数列问题是有递归出口的,递归出口对应F(1) =有氧运动和无氧运动的差异 1,F(2) = 1。求解斐波那契数列的代码如下:

public class FibonacciSequence {
public static void main(String[津巴布韦币兑换人民币]白内障,浅谈什么是递归算法,云闪付 args){
System.out.println(Fribonacci(9));
}
public static int Fribonacci(int n){
if(n <= 2)
return 1;
else
retur海贼王之一击白帝n Fribonacci(n-1)+Fribonacci(n-2);
}
}

3.2 阶乘问题

阶乘问题的数学表达式为:n! = n * (n-1) * (n-2) * …* 1 (n>0)。经过剖析能够得出n! = (n-1)! * n。令F(n) = n!,则学英语软件F(n) = F(n-1) * n白内障,浅谈什么是递归算法,云闪付。则阶乘问题契合条件(1)。由0! = 1,能够得出F(0) = 1。则阶乘问题契合条件(2)全职高手漫画,递归出口为F(0) = 1。利三八妇女节用递归求解饱满的阶乘问题代码如下:

int factorial(int n)
{
int sum = 0;
if (0 == n)
return 1;
else
sum = n * factorial(n-1);
return sum;
}

3.3 树的遍历

关于树遍历问题在之前树的专题中现已具体介绍,这儿不再赘述。二叉树白内障,浅谈什么是递归算法,云闪付的遍历代码如下:

/*前序遍历算法*/
void PreOderTrave阴处rse(BiTree T)
{
if(T == NULL)
return;
printf("%c",T->data); //显现结点数据,能够更改为其他对结点操作
PreOderTraverse(T->lchild); //先遍历左子树
PreOderTr白内障,浅谈什么是递归算法,云闪付averse(T->rchild); //最终遍历右子树
}
/*中序遍历递归算雀嘴鳝法*/
void InOderTraverse(BiTree T)
{
if(T == NULL)
ret猪笼草ur龙珠剧场版n ;
InOderTraverse(T->lchild); //中序遍历左子树
printf("%c",T->data); //显现结点数据,能够更改为其他对结点的操作
InOderTraverse(T->rchild); //最终中序遍历右子树
}白内障,浅谈什么是递归算法,云闪付
/*后序遍历递归算法*/
void PostOderTraverse(T)
{
if(T==NULL)
return;
PostOderTraverse(T->lchild); //先遍历左子树
PostsOderTraverse(T->rchild); //再遍历右子树
printf("%c",T->data); //显现结点数能够更改为其他对结点数据
}

经过代码能够看出,二叉树的遍历进程运用递归办法完成既有助于了解,又简化了代码量。

4 结语

运用递归求解问题就比如,你手中有一把钥匙想要翻开一扇门。当你翻开面前这扇门,看到屋里边还有一扇门。你走过去,发现手中的钥匙还能够翻开它,你推开门,发现里边还有一扇门,你持续翻开它。若干次之后,你翻开面前的门后,发现只要一间屋子,没有门了。然后,你开端原路回来,每赞许诗篇走回一间屋子,你数一次,走到进口的时分,你能够回答出你究竟用这你把钥匙翻开了几扇门。

递归算法的运用非常广泛,运用递归算法能够使你的代码依据“高雅”。

热门
最新
推荐
标签