看下面两个程序,想想它们得的输出结果。
#include<stdio.h> void test1(int n) { if (n > 0) { n--; printf("%d ", n); test1(n); } } void test2(int n) { if (n > 0) { n--; test2(n); printf("%d ", n); } } int main() { int n = 6; test1(n); printf("\n"); test2(n); printf("\n"); return 0; }
运行结果:
思考:为什么被调函数中" printf "所处位置不同,输出结果有这么大差距呢?
test1输出结果按照程序输出,结果与想象一致;test2输出结果并非之前所想。
因为test1是先序递归,先序递归代码是顺序的;test2是后序递归,逆序递归代码是逆序的。
再来看看这个程序,想想它的输出结果。
#include<stdio.h> void test3(int n) { int i; for (i = 0; i < n; i++) { printf("%d ", i); } } int main() { int n = 6; test3(n); printf("\n"); return 0; }
运行结果:
这个和test2输出结果一样,说明什么呢?
说明在有些情况下,递归可以用循环替代,循环也可以用递归替代。
注意:
递归在逻辑上让人难以理解,使代码的可读性降低。
但是,递归只要简单地放个先序后序,就可以把输出结果逆置。
如果用循环,就得改的多了。如下:
#include<stdio.h> void test4(int n) { int i; for (i = n - 1; i>=0; i--) { printf("%d ", i); } int main() { test4(n); printf("\n"); return 0; }
运行结果: