很久没有写技术博客了。
最近发现,递归是一个很有用的东西,在有些情况下可以大大提高程序的效率,但是在某些情况(比如某些计数实现时)会好用大量的时间和空间,甚至可能导致系统崩溃。但是,它无可否认是一个很强大的问题解决技术。比如,我们在建立一个二叉树时,就用到了递归的思想。
有人说过,递归就像两面相对放置的镜子,我们可以在一面镜子中看到另一面镜子的镜像,而且镜像在逐步变小。这也就意味着,我们在解决问题时,可以一样地大化小,小化无。我们在使用递归时,一般都是找一个base case作为递归的基例,然后再逐渐让程序往base case上靠拢。
下面直接上例子吧。
/**
* Output 1 ~ n.
* @param n
*/
public static void output(int n){
// base case
if(n == 1){
System.out.printf("%d ", n);
} // end if
// recurse
if(n > 1){
System.out.printf("%d ", n);
output(n - 1);
} // end if
} // end output
这是一个很简单的递归调用,用来实现一串数字的打印。其中,基例(base case)就是n==1的情况,以后的每一次的调用,都逐渐向着这一目标有规律地靠近。当然,这个问题可以用迭代的方法来实现,这里只是用以说明递归而已。下面的一个例子也是一个比较简单的递归实现:
/**
* Calculate and return.
* @param x
* @param n
* @return
*/
public static int calc(int x, int n){
// count the times of recursion
count ++;
// base case
if(n == 0){
return 1;
} // end if
// recurse
if(n > 0){
return x * calc(x, n - 1);
} // end if
return 0;
} // end calc
这个程序片段完成的功能是递归实现计算x的n次幂。相当于power函数的功能。笔者昨天写了两种递归、一种迭代对此功能进行测试。发现在处理类似问题上,迭代和递归的效率还是差不多的。但是有些问题比如著名的汉诺塔问题基本就是只能用递归了。
也就是在前天,学校举行的ACM网络赛有一道牛繁殖的问题(类似兔子繁殖问题),我最开始的反应也是用递归实现,而且用C在20行就解决了,代码就略了(前天忘了拷贝回来了,而且类似的代码不少),但是submit时一直不成功,原因很简单:超时了!!后来我测试一下比较大的数,还真的几十秒才出来,太大的话就干脆不出来了!!所以,用递归实现类似的计数类得问题,建议还是首选迭代吧。
好吧!到此说声晚安吧!明天早上8点还得去集训呢!!
加油加油!!!
最近发现,递归是一个很有用的东西,在有些情况下可以大大提高程序的效率,但是在某些情况(比如某些计数实现时)会好用大量的时间和空间,甚至可能导致系统崩溃。但是,它无可否认是一个很强大的问题解决技术。比如,我们在建立一个二叉树时,就用到了递归的思想。
有人说过,递归就像两面相对放置的镜子,我们可以在一面镜子中看到另一面镜子的镜像,而且镜像在逐步变小。这也就意味着,我们在解决问题时,可以一样地大化小,小化无。我们在使用递归时,一般都是找一个base case作为递归的基例,然后再逐渐让程序往base case上靠拢。
下面直接上例子吧。
/**
* Output 1 ~ n.
* @param n
*/
public static void output(int n){
// base case
if(n == 1){
System.out.printf("%d ", n);
} // end if
// recurse
if(n > 1){
System.out.printf("%d ", n);
output(n - 1);
} // end if
} // end output
这是一个很简单的递归调用,用来实现一串数字的打印。其中,基例(base case)就是n==1的情况,以后的每一次的调用,都逐渐向着这一目标有规律地靠近。当然,这个问题可以用迭代的方法来实现,这里只是用以说明递归而已。下面的一个例子也是一个比较简单的递归实现:
/**
* Calculate and return.
* @param x
* @param n
* @return
*/
public static int calc(int x, int n){
// count the times of recursion
count ++;
// base case
if(n == 0){
return 1;
} // end if
// recurse
if(n > 0){
return x * calc(x, n - 1);
} // end if
return 0;
} // end calc
这个程序片段完成的功能是递归实现计算x的n次幂。相当于power函数的功能。笔者昨天写了两种递归、一种迭代对此功能进行测试。发现在处理类似问题上,迭代和递归的效率还是差不多的。但是有些问题比如著名的汉诺塔问题基本就是只能用递归了。
也就是在前天,学校举行的ACM网络赛有一道牛繁殖的问题(类似兔子繁殖问题),我最开始的反应也是用递归实现,而且用C在20行就解决了,代码就略了(前天忘了拷贝回来了,而且类似的代码不少),但是submit时一直不成功,原因很简单:超时了!!后来我测试一下比较大的数,还真的几十秒才出来,太大的话就干脆不出来了!!所以,用递归实现类似的计数类得问题,建议还是首选迭代吧。
好吧!到此说声晚安吧!明天早上8点还得去集训呢!!
加油加油!!!