#include<stdio.h>
int main()
{
//求和1+1+2+3+5+8+……+(前15项之和)
// 方法1
/*int sum=2; //声明和
int a=0; //声明项值
int x=1; //声明a的前一项
int y=1; //声明a与x之间的那一项
for (int i=3;i<=15;i++){
a=x+y;
x=y;
y=a;
sum=sum+a;
}
printf("第15项:%d\n",sum);*/
// 方法2
long sum = 2; //声明和
long b = 1; //声明a的前一项
long a = 1; //声明项值
long c = 0; //声明变量用来储存值
int i = 0;
for(i = 3;i <= 15;i++){
c = a;
a += b;
b = c;
sum=sum+a;
}
printf("第15项:%ld\n",sum);
return 0;
}
声明:此博客为初学者所著,高手绕行
方法二:为老师所讲解法
方法一:为自己所做解法
对比两种解法,请分别看声明和初始值,再看表达式
我们都知道,求和算法:
sum=sum+a(sum+=a),这是通用的
对于此算法 的解释:
循环相加,数学表达式如下:
Sn=Sn-1+An
再看方法二:
a+=b;
此算式和sum=sum+a(sum+=a)很相识,完全可以认为它们就是相同的。
但有一点需要注意,请回看声明部分和表达式部分
这两种不同的算法,它们的结果是完全一样的,那么这里便有疑问;
疑问一:
a+=b,到底是什么意思?
要解释这个问题,得回到上下文
我们可以看到:
c=a;
a+=b;
b=c;
a+=b,是放在中间的,这就是问题所在
为什么仅仅是因为放中间,它就与
sum=sum+a(sum+=a)不同了呢?
这里就要说到赋值,这个东西。
疑问二:赋值到底是怎么回事
请看方法一中的表达式:
a=x+y;
x=y;
y=a;
sum=sum+a;
我们看视频和某些资料,会发现讲解人这样说:
当x=y;发生时,就是将y中的值赋给了x;
然后就没了,资料或者视频讲解者,说到这里就完了;
这里就是个误区,后面呢?y发生了什么,y的值呢?
这里就要说到思维跳跃,这个东西。
疑问三:讲解者的跳跃思维——导致错误
x=y;表示,将y的值赋给x;
那么y现在的值是多少,还有没有值?
在我所看视频中,讲解者说,此时y里面没有值了。
那么没有值了,为什么方法一中:
sum=sum+a;
还能计算出结果呢?正确的结果。
这就是讲解者的思维跳跃对我们导致的影响;
思维跳跃导致表达语句在被讲解者接收时出现偏离。
通俗的讲,讲解者说的是一回事,我们理解的是另一回事,但双方都没有发现。
通过我询问别人,知道这么个东西:
赋值==复制;
此时我想起来,我所看视频中,讲解者有这么句话:
“你们可以这样理解……”
于是,讲解者说的没错,他在用比喻句话说某个东西,只是表达的不准确而已
所以,这里对所有的前辈提出一个问题:
“你们是否确定,你所说即是我所听?”
正是因为这个原因,本人花4个小时用解法一,算出了结果,
因为讲解者的思维跳跃太多,他花两分钟讲题,我花四小时解题,这对于双方来说,实则算不上双赢。
疑问四:C语言的正确写法(重点)
对于这个问题,实际上还是疑问三导致;
我们可以回想:
在讲解人解题时,直接就先列出很多变量,然后便开始讲解算法,表达式
因为,讲解人知道此题需要多少变量,他心中对整个问题已经充分把握,于是接下来:
开始初始化,开始列表达式
但是,这样的思维跳跃,对于被讲解人实在是难以理解
最终导致结果,我们得鱼缺未习渔
我有充分的理由相信,很多讲解者在这样做,
我有充分的理由相信,讲解者给被讲解者造成了多少麻烦,
我有充分的理由相信,所谓公司内的前辈们,讲解者们大多是如此,
我们充分的理由相信,你们所说与我们所得,完全是两回事。
在学习中,避开讲解者的讲解,自己深入了解后,我懂了:
是否声明变量,是逻辑思维的结果;
是否初始化,是思考表达式的结果;
是否正确,是无限次数验证的结果;
是否合理,是结果正确,表达式正确的结果,乃至无限次数优化的结果。
那么结尾:
我依然想问:
“讲解者,你们是否确定,你们所讲与我们所得是相同的?”
最后站在客观的角度:
“一个不具有准确表达能力的讲解者于被讲解者来说,简直就是灾难。”