day10

昨天说到按值传递和按引用传递,总之,用起来的话,列表是按引用,字符串用起来和整数或浮点一样。

所以说如果要复制一个列表,就直接用[::]吧。

说到第一个练习题,其实这个在很多地方都做过,之前做过一个求当前目录下所有文件数量的题,其实和这一题是一样的,但今天在上班的时候对这个有些不清楚。

刚回到家整理思路以后,总算是解出了这个 问题,以防后续对与递归还是稀里糊涂的话,我看能不能分析一些经验出来。

先上代码

1 def nested_sum(list):
2     sum = 0
3     for item in list:
4         if type(item) == type([]):
5             item = nested_sum(item)
6         sum = sum + item
7     return sum
8     
9 print(nested_sum([1,[1,2],[1,2,[1,2]]]))

我再之前的代码里是搞不清这里关系的,我现在突然回忆起我之前说过的一些话,怎么去思考递归,就是假设这个函数功能实现了。

我们借着这个思路推过去,假设我们nested_sum函数实现了,如果碰到是列表的话,那就是直接调用这个函数,得到他的返回值就好了,我们就可以开心的累加了,没了,就这么结束了,简单的让我怀疑人生。

 下一个题莫名的花费了比较多的时间,其实这个题也是个经典的题目,在很多地方都看到过,就是一个双层循环。

 1 def cumsum(list):
 2     new_list = []
 3     for i in range(len(list)):
 4         sum = 0
 5         for j in range(i+1):
 6             sum = sum + list[j]
 7         new_list.append(sum)
 8     return new_list
 9     
10 print(cumsum([1,2,3]))

这道题为什么话费了很长的时间,一是,有点急于求成,其实在双层循环还没完全弄清楚时,有些强行一次写完所有代码了,有些事还是一个个函数分解清楚,也许会更清楚。

二是,自己对range的理解出现了偏差,range(0)其实是一次都没有,range(1)是一次,但是这个值却是0,这个是需要我吸取教训的。

 

练习10.8暂时跳过

然后跳到一个很重要的习题,手写二分法,一开始写的很乱,在回忆起之气那用start 和 end来标志好的话,发现逻辑会更清晰一些,就做了一个这样的版本

 1 def in_bisect(lb, target):
 2     start_point = 0
 3     end_point = len(lb)
 4     middle_point = int((start_point + end_point) / 2)
 5     
 6     # middle = int(len(lb) / 2)
 7     count = 0
 8     while True:
 9         if target > lb[middle_point]:
10             start_point = middle_point
11             middle_point = int((start_point + end_point) / 2)
12             count += 1
13         elif target < lb[middle_point]:
14             end_point = middle_point
15             middle_point = int((start_point + end_point) / 2)
16             count += 1
17         else:
18             return middle_point, count
19             
20 lb = []
21 for i in range(113809):
22     lb.append(i)
23     
24 print(in_bisect(lb, 1))

理论上应该是没有问题的,不过我也不知道,毕竟只测试了几个数值。

然后再跳过10.11与10.12的练习,后来再补。

转载于:https://www.cnblogs.com/onhacker/p/7067600.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值