切披萨饼
问题:n刀最多把pizza切成几块?
分析:其实还是递推思想,比如两刀可以切成4块,那么下一刀,也就是第三刀,肯定是要和前两刀的每一刀线都要相交,这样才能保证切成足够多的块数,这样一来,就会多出 4 个交点(包括与圆的边界的焦点),也就会多出 3 个小块,原因时是每相邻的两个点就会确定一个多出的小块。容易推出,第 n 刀切下去最多会多出 n 块。递推关系是:
\(f(1) = 2; f(n) = f(n - 1) + n\)
C语言代码测试:
# include<stdio.h>
int CutPizza(int n)
{
if(1 == n)
return 2;
else
{
return CutPizza(n - 1) + n;
}
}
int CutPizza02(int n)
{
return ((1 + n) * n) / 2 + 1;
}
int main(int argc, char *argv[]) {
int res = CutPizza(8);
int res2 = CutPizza02(8);
printf("一共可以切 %d 块\n", res);
printf("第二种方法的结果:%d 块", res2);
return 0;
}
注意,根据递推关系,我们很容易就可以得出通项公式,所有上面的 CutPizza02 就是通项公式,在这里是比递归要好上很多的。
运行结果: