“一支穿云箭,千军万马来相见”
兄弟们我来应箭赴约了!尽管在上篇博客里我有所保留(单纯的水而已),但这次我绝对不会手下留情了,就让我来一道循环结构的题目,征服你的大脑吧!😈😈😈
2023.10.27日, 博主认为无论发生了什么事,不沉湎于过去, 面向未来才是对前人最大的尊敬,如今我们应该做的,就是把@大伟爱编程的所有博客都看一遍,学好了技术再去报国!
那咱们就上代码了!
int f1(int n)
{
if(n <= 1) return 1;
else return f1(n - 1) + 2 * n - 1;
}
int f2(int n)
{
if(n <= 1) return 1;
else return f2(n - 1) + f1(n);
}
int main()
{
printf("%d", f2(100));
}
当我们扫描完这道题的时候会发现,这是个无﹉限套娃!,而且偏偏循环次数hin多,估计hin多人都会晕了吧,hh
所以,博主认为看到这类题目时要做的事就是克服自己恐惧的心理,看到这里会不会已经有佬儿把答案算出来了呢?那就请没有思路的铁汁们跟着博主的脚步一步一步来看一下吧!
读题后我们发现结果需要求的是f2(100),一开始其实也没什么技术含量,那就把f2(100)带入呗,得f2(100)= f2(99)+ f1(100)
接下来再把f2(99)和f1(100)分别带入得f2(99)=f2(98)+ f1(99),f1(100)= f1(99)+ 2*100 - 1
根据这两次拆分,我们应该会从中发现一点规律:f2(100)= f2(99)+ f1(100) = f2(98)+ f1(99)+ f1(99)+ 2 * 100 - 1 = f2(97)+ 2 * f1(98)+ 2 *(2 * 99 - 1)+ 2 * 100 - 1 = 2 * 100 -1 + 2 * (2 * 99 - 1)+ 3 * (2 * 98 - 1)+.......+100 * (2 * 1 - 1) = 2 * (100 + 2 * 99 + 3 * 98 +....+99 * 2 + 100 * 1)-(1 + 2 + 3 +......+100)=...............(博主私下算了一下,算了半天也算不到,太麻烦了😥,所以以上为废话,仔细看了的小伙伴会不会觉得损失了呢😘)
以下为草稿:
(/_\)大怨种
但我相信应该没有人会像博主这么傻吧(不会真的有吧😂)。其实随着科技的进步,聪明的人类将复杂的算法不断简化,于是我们只需要把上面的代码cv到编译器里...... 于是我们来看一种更简单也更普遍的方法:
解决问题有个比较普遍的方法:正着来不行,我们就反着来
先盯着f1看,把n由0递增,可得f1 = 1 + 3 + 5 +......... +2 * n - 1,即为奇数的和,即En(f1) = (1 + 2 * n -1)* n / 2 = n ^ 2,即En(f1)表达式为n ^ 2
然后我们再看f2,将f2的项全部换为f1,即f2(n)=f1(n)+ f1(n-1)+.....f1(2)+ f(1),即所有n ^ 2的和(附加一下公式:En(f2) = n(n + 1)(2 * n + 1)/ 6)
那这样倒着看就会发现这道题很简单了,f2(100)= 100 * 101 * 201 / 6 = 338350
铁汁们,其实这道题答案是多少并不是很重要(但比赛时答案就重要了🤐)。通过这道题我们要有些收获:
方法有时比努力更重要,技巧有时比力量更强大。
铁汁们懂了吗?
一年好景君须记,最是橙黄橘绿时
那么本篇博客也就到此为止了,送大家一碗鸡汤,勉励自己以及这世界上所有追逐梦想的赤子趁年华尚好努力提升自己,莫欺少年穷!