一个比较问题
(一)一个比较问题:
一个人想每天努力多一点。
(二)对比较问题的模拟:
一个人在第一天画一个正方形
(图4-1)
在第二天画两个正方形
(图4-2)
在第三天画三个正方形
(图4-3)
。。。。。。
在第n天画n个正方形
(图4-4)
(三)关于比较问题的模拟的疑问
那个人在第一天之后是否在原来的基础上画正方形,即是在看着之前画的正方形或者函数的基础上画当天的正方形,还是直接画出当天的正方形。例如:
在第四天时,那个人看着之前画的正方形或者函数,画出第四天的正方形
(图4-5)
(图4-6)
在第四天时,那个人直接画出当天的正方形
(图4-7)
如果那个人在看着之前画的正方形或者函数的基础上画当天的正方形,则存在比较,比如第三天的正方形与第二天的正方形进行比较,第二天的函数与第三天的正方形进行比较。
五、关于比较问题的深入探讨
在比较问题中,如果那个人是在原来的基础上进行操作,那么存在对原基础进行抽象的现象,现象产生的原因是正方形占用大量的面积,希望通过抽象来减少面积的占用。
对比较问题进行模拟以及分析后,不难选择用阿拉伯数字对当天方块进行抽象,例如:
(图5-1)
通过枚举法,不难抽象原基础,过程如下:
第一天有1个正方形,记为1
(图5-2)
第二天有3个正方形,变形,记为3×1
(图5-3)
第三天有6个正方形,变形,记为3×2
(图5-4)
第四天有10个正方形,变形,记为3×3+1
(图5-5)
第五天有15个正方形,变形,记为3×4+3×1
(图5-6)
第六天有21个方块,变形,记为3×5+3×2
(图5-7)
不难发现当天的总方块数为3×昨天要画的方块数+大前天的方块总数。
以下用程序检验:
#include <iostream>
using namespace std;
const int num = 13;
int func(int n);
int main() {
cout << func(num) << endl;
cout << (num*(num+1))/2 << endl;
return 0;
}
int func(int n) {
if(n == 1) {
return 1;
}
else if(n == 2) {
return 3;
}
else if(n == 3) {
return 6;
}
else {
return (3*(n-1)+func(n-3));
}
}
运行结果为:
91
91
综上,文中的迭代式是正确的。