计算机科学与编程导论(lecture 4-5)

MIT的计算机科技与编程导论这门课,之前一直使用SICP来作为教材。(翻译评价不佳,英文原版更好)

但是从08年开始,开始使用python教学,网上的公开课也是08年版本的。
贴出一些学习笔记,欢迎拍砖和补充。课程到第五课为止。笔记只是我觉得很重要的记录下来了。之前的1-3三节课说的更多的是编程思想方面的事物,难以正确的描述,所以不写出来了。
 
-----------------------------------------我是分隔线-------------------------------------------
 
关于程序和函数
函数是为了找出某种计算的通用模型,例如计算平方根,等;
程序应该模块化和抽象,可以作为单独使用的模块。细节的抽象化,以及编写正规的引用文档
每个函数都有返回值,即使是返回一个值来停止函数运行。C:return 0;python :return None;OC:return 0;
 
-----------------------------------------我是分隔线-------------------------------------------
 
Python函数的语法:
def  定义一个函数
NAME 给函数命名
return  程序运行到这里停止
None   None的意思返回一个值,这个值说明函数是没有返回值的
 
-----------------------------------------我是分隔线-------------------------------------------
 
函数的本地绑定:函数内的赋值 有效范围只在函数内部。
函数的本地绑定不影响全局绑定
 
每个函数需要撰写说明文档;
并且在开局要做判断语句,为了判定数据的输入是否是你规定的类型和范围,为了防止别人不遵守规矩。
 
-----------------------------------------我是分隔线-------------------------------------------
穷举算法
问题:农场里有猪和鸡,有X个头和Y只脚。问有多少只鸡和猪。
输入头的数量和腿的数量。做出一个函数来判定猪和鸡的个数。(用C和objective-c和python写出来)。
 
问题:农场里有猪和鸡和蜘蛛,有X个头和Y只脚。问有多少只鸡,猪和蜘蛛。
输入头的数量和腿的数量。做出一个函数来判定猪,鸡和蜘蛛的个数。(用C和objective-c和python写出来)。
 
-----------------------------------------我是分隔线-------------------------------------------
 
递归:用不同的变量让函数去思考问题
归纳法的步骤or递归递推步骤;
具有继承意义的迭代。以循环的模式来运行的解决方法;
将问题分解为更简单的同类问题以及其它一些步骤;
 
回文的判断(从左,或者从右读,都是一样的字符串)
一:是否符合基础性要求,length>=1;是则继续
二:判断首尾是否相同;是则继续
二:将首尾各减1,判断是否相同,是则循环。直到最后,完全相同。
四:直到最后,完全相同。则返回YES。
 
扩展阅读:Fibonacci number :后面一个数是前两个数之和 (跟递归有关)
 
 
-----------------------------------------我是分隔线-------------------------------------------
python的数据类型
整型: int
python支持任意精度的整数  可以给int赋值任意大小的数  例如 2**10000(PC差点死机了。)
以L结尾的是LONG INTERGER
处理的数大于20E就跨入LONG INTERGER范围了
用L和L型数值相除。同样会得到L型数值,无论数值大小
 
浮点型:
遵守 IEEE754。(这是科学计数法的变异,用一对尾数和指数来结尾浮点数)
即:mantissa 和exponent
1<=mantissa<=2
-1022<=exponent<=1023 
 
现代计算机语言是64bit的;
1 bit for sign  (符号:即+-号)
11 bit for expo   (存放指数)
52bit for mantissa   (存放尾数)
 
可以让我们表达大概17个数长的10进度精度;
 
-----------------------------------------我是分隔线-------------------------------------------
 
在python中显示会调用函数repr()。而它显示浮点数最多只会结尾到17位。例如在1/10;  这个浮点数。用二进制就无法完全得到。只能得到近似值。
 
例如  for i in range(10): s+=0.1
因为无法正确显示浮点数0.1  就会不断的累积添加错误。导致显示错误。上机练习,因为是python3  显示的跟课程不一样。求解答。
 
-----------------------------------------我是分隔线-------------------------------------------
 
python使用import来调用函数
例如调用math
import math
a = math.sqrt(2)
a*a == 2
False //因为对于浮点数取值。只会取17位以内的近似值。所以a*a!=2
 
所以在比较浮点数时,就需要写一个函数来比较其是否近似
abc(a*a -2.0)<epsilon(一个极小的正数)
 
写一个找出平方根的方法
1、找到不是完美值,例如根号2
 
successive approximation  逐次逼近法
每次逐次逼近法都有着相同的结构
 
guess initial guess      //初始化guess
for iter in range(100);   //一个100次的循环
if f(guess) close enough, return guess  //如果guess相当的接近了,返回
else guess = better guess //否则  guess 就== 更好的guess
Error                   循环结束,未找到,返回Error
 
Bisection method   
二分法
将数列分为两段。取中间数:
如果小了,则取右边的数列
否则如果大了。则取左边的数列
再循环
 
迭代的循环与我们所求值和返回值的精度有关

转载于:https://www.cnblogs.com/xxppxiaowei/archive/2012/11/16/2772758.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值