算法设计基于Python(001)—【递归】折线分割平面问题

    题目是这样的:求n条折线分割平面的最大数目。比如下图,一条折线分割成2部分,两条折线分割成7部分。


    在解这道题目之前,先要了解下,直线分割平面的问题。(n条直线,最多可以把平面分为多少个区域。)

    我们假定n条直线分割的平面的数目为f(n),则n-1条直线为f(n-1),第n条直线加到n-1条直线上面,和每条直线产生一个节点,一个产生n-1个节点,则第n条直线被分成n部分,其中2条射线,n-2条线段。

    每条线段和射线已有区域一份为2,所以多出了2+(n-2)个区域,即多出n个区域。

    你可以简单的理解为,加上去的“第n条直线”被分成几部分,就多出几个区域

    则可能递归公式f(n)=f(n-1)+n,其中f(0)=1。

    我们也可以相应的求出这个递归公式的值:

    f(n)=f(n-1)+n

             =f(n-2)+(n-1)+n

             ……

             f(0)+1+2+…………+n=n(n+1)/2+1


    在有这个基础知识之后,我们再来看,折线分割的问题。

    假定当有n折线时,区域数为f(n)。则当有n-1条折线时,区域个数为f(n-1)。当我们加上“第n条折线”时,为了使增加的区域最多,则折线两边的线段要和前n-1条折线的边,即与2*(n-1)条线段相交(一条折线,可以视为两个线段)。产生了4*(n-1)个节点,套用直线的思维,这条折线(你可以视为直线来看),为分为了4*(n-1)+1。

    故递归公式可以写为:f(n)=f(n-1)+4(n-1)+1。其中f(0)=1。

    当然你也可以具体求出这个递归方程。

代码如下:Python

def func(n):
    if n==0:
        return 1;
    else:
        return func(n - 1) + 4 * (n - 1) + 1;

n=int(input("please enter a number:"))
print(func(n))

代码如下:C

#include<stdio.h>
int main()
{	
	int func(int);
	int n;

	scanf("%d",&n);
	printf("%d\n",func(n));

	return 0;

}

int func(int n)
{
	if(n==0)
		return 1;
	else 
		return func(n-1)+4*(n-1)+1;
}







猜你喜欢

转载自blog.csdn.net/sinat_28576553/article/details/80160392
今日推荐