先序递归与后序递归

看下面两个程序,想想它们得的输出结果。

#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;  
}  
运行结果:


猜你喜欢

转载自blog.csdn.net/free377096858/article/details/79987733