作者hetea (hetea)
看板Examination
标题Re: [心得] 高考资讯处理心得(收到成绩单後)
时间Thu Sep 25 11:15:54 2008
※ 引述《hetea (hetea)》之铭言:
: 资料结构:
: 主力科目,答案都是一翻两瞪眼,对就是对,错就是错,
: 在笔者感觉比(系统分析与资讯管理)更明确拿的到分
: 在上一篇中,这一科我列了两本书,其中当读完第一本後,
: 第二本会让你功力再精进甚多,(笔者在关务93,高考90)
: 如同程式语言,笔者是每一题都做。
: Graphic跟Tree,Sort/Search 都是必看
: 至於recursive程式(因之前为programmer,这部份并没有困扰),
: 今年考试至少都会出一题。有机会还是要把握一下。
: 要试着从起始条件与终止条件思考。
: 在考试当场写的程式不一定要最漂亮/优美/效率最好(因为没时间)
: 力求写出题目要求即可。
有网友问到之前关务的一题递回程式怎麽想或如何写才能得分
题目
试以任一电脑语言(或虚拟码)以递回程式来
计算sin(x)的值。(15 分)
计算sin(x)的公式如下:
sin(x)=x-x^3/3! + x^5/5! - x^7/7! + x^9/9! -....
(考虑求值到小数以下第六位)
笔者解题思考的步骤
基本上
至少要能找出规律性
写出程式雏型(不一定要对),但是要让改卷老师知道考生观念到底会不会
当然有时也会困在找不出规律性,卡很久或造成此题写不出来
递回程式一定需要重覆执行相同的动作
1. 首先找出规则性
2. 这是一个序列,找出其规则
第一项 x
第二项 (-x^3)/(3*2*1)
第三项 x^5 /(5*4*3*2*1)
第四项 ...
可以看出分子 x -> (-x^3) -> x^5 规则为等比级数 -x^2
分母 1 -> (3*2*1) -> (5*4*3*2*1) 为N阶乘.但是每次以增加2的等差级数
找出规律性,就能往程式方面着手
3. 接下来就是应用在递回程式
i. 回传值(因为题目有限定在小数点下六位)
=> 选择float或是double的精确度都可以适用
ii. 程式名 sin_cal(自己定)
iii.参数 (这部份就要思考一下)
要从刚刚的规则分析,找出多少资讯要往下传
a. x (型态可以为float或double, 当然若写成int 可能会被扣分)
b. 等比跟等差级数的项次(int)
(一开始可能只想到这样,那就先这样写)
float sin_cal(float x, int exp)
iv. 找出终止条件
求值到小数点以下六位
?? < 0.000001
观察一下,??就是新增的项次且不用考虑+/-号
新增的项次
float sum=1.0;
for(i=1;i<=exp;i++)
{
sum = sum * x / i;
}
if(sum<0.000001) return 0;//因为小於0.000001就不用再算了也不加入此项
v. 利用刚刚的数列找出递回
因为是数列要相加
所以
else
return (sum + sin_cal(x, exp+2));
此时发现,哇,怎麽没有正负号
方法a. 在呼叫时,多一个参数去记+/-
(再回头增加参数sign,并把
return ( sum + sin_cal( x, exp+2 ));
=> return ( sum*sign + sin_cal( x, exp+2 , -1*sign ));
方法b. 计算sum时,把+/-也计算进去
但在终止条件就需要把正负号考虑进去
(否则负数永远小於0.000001)
vi. 最後再把全部程式整理一下
vii.把如何呼叫的部份也说明一下
float x=1.0; //设定x
sin_cal( x , 1 , 1);
能写到什麽程度,就尽量写,但是要以有把握不写错的部份
考试时间不多,不用考虑太难太漂亮的写法
这个程式,拿来现实上会被complain,但是在考试上是OK的
-----
递回程式
float sin_cal(float x, int exp,int sign)
{
float sum=1.0;
int i;
for( i=1 ; i<exp ; i++)
{
sum = sum * x / i;
}
if(sum<0.000001) return 0;
else
return (sin_cal(x,exp+2,-1*sign) + sign*sum);
}
呼叫时:
sin_cal(1,1,1);//x=1时
sin_cal(0.2,1,1);//x=0.2时
sin_cal(2.1,1,1);//x=2.1时
以上为大致思考过程,希望对大家有所帮助,
若有谬误之处还请指教、见谅。
最後,笔者觉得有一个递回可帮助思考
一个single link list的字串如何用递回方式反转字串
有空可以思考一下。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 119.14.0.193
※ 编辑: hetea 来自: 119.14.0.193 (09/25 11:16)
1F:推 dinshi:推推 09/25 11:31
2F:→ Mcdona1d:恭禧~~~~~~~~~~~~~ 09/27 11:39