最近高等代数正好讲到这里,此篇文章正好对所学知识做一个具体程序实践。
设计算法时使用递归的思想是一个程序员的基本素质,递归可以把一个很庞大的问题转化为规模缩小了的同类问题的子问题,通过这一思想,我们编程时运用递归可以使用很少的代码来处理很大的问题。这篇文章将会讲到递归算法的运用。
在数学中,很多数学函数都是由一个公式来表达的,比如 f(x) = 100x; 这个公式可以让我们把长度米转换成长度厘米。 有了这个公式,在程序中敲出一行代码,写出一个函数(function)来计算实在是太简单方便了,就像这样。
int convert(int m){
return 100*m;
}
我们就写好了一个函数来进行米到厘米的单位换算。
但是有的时候,数学函数会以不太标准的形式来定义,比如这个函数,他满足 f(0)=0而且 f(x) = 2f(x-1)+x; 从这个函数定义我们可以得出 f(1)=1;f(2)=3;等等。当一个函数用他自己来定义时就称为这个函数是递归的。
通俗地讲,就是从前有个山,山里有个庙,庙里有个老和尚再给小和尚讲故事,讲的是:从前有个山,山里有个庙,庙里有个老和尚再给小和尚讲故事。。。。这就是递归。
好了说了这么多你们肯定还是一头雾水,现在来实践一下。
递归求阶乘
刚开始学编程的同学一定会写求阶乘的函数,使用for循环或者while循环都可以,但是递归却完全用不上这两个循环。
public static int factorial(int a){
if (a==0 || a==1){
return 1;
}
return a*factorial(a-1);
}
上面的代码就是递归求阶乘的方法,a是需要传入的参数,比如我们要求5的阶乘就传入5这样factorial函数最终的返回值为120;
分析这段代码,他的第3行到第五行处理了 基准情况(Base Case),在这个情况下,函数的值可以直接算出而不用求出递归。就像上文提到的函数f(x) = 2f(x-1)+x;如果没有f(0)=0这个事实在数学上没有意义一样。 再编程中,如果没有基准情况也是无意义的。第7行执行的是递归调用。
所以所,设计递归算法ÿ