- 博客(200)
- 资源 (4)
- 收藏
- 关注
原创 习题2.2
在这个例子中,我没有看明白数据抽象在哪里,如果说用函数来屏蔽了代码的细节,形成了抽象屏障,那也是将就可以理解。通过4个函数,屏蔽了上层对数据细节的关注。没有刁难程序,直接用 1,1 3,3两个点 ,人工计算结果也是2 ,2 与预期相符,计算过程正确.写出如上代码很简单计算过程也是很简单的,我就不多说。本章的目的是学会如何进行数据抽象。
2025-03-31 17:35:32
21
原创 习题2.1
对以上代码做点解释,frist和last这块是语法不同导致的。使用list而不是是cons,是因为Clojure语言中cons 最后一个元素需要是list类型,与原来语言的含义不同。make-rat的核心代码部分,使用 n 和d的乘积来判断他们是同号还是异号,同号则分子分母均取abs即可,异号分子先取绝对值,再变为负号,分子直接取绝对值。只是为了代码好写才如此处理的。从结果可以看出,函数能正确约分并输出分数的正负号。需要注意一点,再求gcd的时候,输入参数需要均为正数,否则会出现错误。
2025-03-30 18:27:14
31
原创 习题1.26
之所以会从对数级变成线性级,主要原因在于代码的展开方式,在使用square方法的时候,先计算一遍expmod 函数内的值,然后对计算结果进行平方计算。在使用乘法的时候,是计算了两次expmod函数内的值,然后再将结果进行相乘计算,在偶数的情况下 每次都会将同一个运算多做一次。假设我们要计算的exp为1024,那么使用square总共要计算expomd表达式10次,即以2为底1024的对数。使用乘号的话,需要2+4+8+++1024=2046 ,可以简略看做2*1024也就是线性级函数。
2025-03-30 16:35:18
147
原创 习题1.43
这个题目,费了一些时间,写了几个版本,都达不到目标,虽然对题目的理解很到位,也知道要解决这个题目,应该是什么模式。还是费了很多功夫折腾。最后还是注意到提示部分,才明白应当如何实现题目。执行结果如下.代码实现了对5^2进行了平方,即对平方操作执行了两次。compose方法上篇文章已经实现过。代码如下,确实非常简单。
2025-03-29 19:08:39
59
原创 编写一个java小工具踩的坑
经过debug发现原来最后一次读取的长度不够2046个byte,上次读取的内容没有清空,导致转换为sql后,长度远超原来的字符串。读取终于没有问题了,开始整输出代码写完直接执行,只检查了生成的几行sql,没有问题,以为已经OK,于是丢去补数据。这一版又出现了个诡异的现象,直接用idea运行,可以正常读取解析,使用命令行执行,imix包会提示field长度解析异常。整体思路是,先从日志中拿到imix报文,保存为txt,然后用java读取,直接转换为insert语句保存为sql文件。
2025-03-11 18:17:39
139
原创 习题2.41
这个题目初看非常简单,但是在两个点卡主我了。一个是如何把第二个参数传递给filter的过滤函数。二个是生成三元组,生成不重复的三元组。开始想的太简单了,实现后生成的三元组有重复。认真思考,决定采用模拟二元组的办法进行嵌套。第一个问题,一开始我想到了用闭包来解决,但是受到java中闭包使用方式的影响,首先尝试的是在内部方法中直接使用外部参数。失败后,查找资料后解决。
2024-10-27 15:36:10
172
原创 在window10下使用directml加速phi-3模型的一些记录
有两点要特别讲一下,第一,可用使用 torch_directml.device_name(0)来查看具体使用的是哪个显卡。3.参考微软官网【在windows上通过DirectML启用Pytorch】文档,安装torch_directml模块。4.参考微软官网【在windows上通过DirectML启用Pytorch】文档,验证设备是否可用。最后要说明一下,我上面的代码并没有进行完全验证,主要是在执行到加载模型处,因显卡内存不足,程序退出。文档,检查系统版本 检查gpu版本。5.下载phi-3模型。
2024-10-06 15:00:59
535
原创 习题2.38-2.39
但是这块代码和2.18版本的代码比较一下,能更深刻的理解accumulate运算过程。将这些问题与java中的函数式编程合起来思考,会发现lisp写起来真的很方便,得益于数据结构。list结构、first、rest、cons 操作,会极大的简化代码。list结构,像是链表,但是又比链表强大,链表无法组装出树结构。执行结果呢已经写在了注释里,要想让op的操作左右相同,必须满足交换律。通俗点说,就是两个参数交换,不影响计算结果,比如加法,乘法 与运算 或运算等等。这个题目的结果挺简单,上代码。
2024-08-16 15:35:24
172
原创 习题2.37
如果对矩阵运算非常熟悉,这段代码非常容易补足,略微思考一下就行。需要注意的是,这道题的map,可以使用原生语言提供的,反而不能使用以前题目中自己写的map。代码中的w 和v是用来测试的数据,都能正确的执行。执行结果也有人工核算。矩阵乘法实质就是逆转第二个矩阵并遍历,进行矩阵向量乘法。而矩阵向量乘法实质就是遍历矩阵的行,和向量进行点积。部分代码有使用以前题目写过的,我没有复制过来。
2024-08-16 15:14:19
90
原创 习题2.35
于是就回归map返回所有叶子节点。在map中也是因为无法递归,无法将树转换为一维list,想了想,定义了cons2方法,可是用系统原生 的map,无论如何调整,都无法把树形结构改成list。忽然想到可能是语言实现层面的差异,于是使用2.33中的map,发现居然一次性就成功了。代码马上就跑出了正确的结果,为了以防万一,还测试了几个特别复杂的结构,均正确计算出了结果。在编写的过程中,犯了一个很严重的错误,导致消耗了我2个小时,就是使用了系统原生的map方法,而不是2.33的map方法,导致执行一直出错。
2024-08-14 09:35:59
57
原创 习题2.34
这个题目,我真的费了好多时间,总结起来,就是对公式理解不到,好不容易理解了公式,又出现计算结果有偏差的情况,反复思考折腾代码,都毫无结果。于是先写了一版自己理解的公式,按照自己的思路写,结果无误,但是无法按照题目要求改造好。唉,唯一的缺陷就是a0要特殊处理。昨天晚上灵机一动,重新思考了公式的本质,立刻想到了办法。很典型的实现逻辑 没有什么复杂的技巧,之所以要定义内部函数,是因为我理解的公式,a0需要特殊处理。心得,遇到问题,还是要先从业务层面思考,需要思考透,才能写出更好的代码,简洁 高效,易修改。
2024-08-14 09:23:17
179
原创 习题2.29
题目终于想通了,贴代码吧,代码只做了浅层数据结构测试,不是很确定更深层次的数据会不会也是成功的。从对比代码看来,修改的主要是跟结构相关的部分,计算部分并没有涉及到。
2024-08-11 10:14:59
53
原创 习题2.32
map的第一个参数,是遍历并执行的方法,这个方法使用s的第一个参数,与map遍历时传入的参数合并形成新的序列。这个题目 粗看起来好像是很简单,但是我在实现的时候,真的是废了好大的力气,主要原因有三点,第一,对clojure语言的属性程度不够高,第二,课本语言与clojure语言的差异点,我自以为理解的很透彻,导致了出现很奇异的现象,我找不到解释,一点思路都没有。当if为真时 返回给上一层调用的内容为(()),(())和其他元素做concat就是(() (3) (2)( 2 3))。
2024-08-05 18:26:14
174
原创 习题2.31
相当于将方法以参数的形式传递给方法内部,并在适当的时候调用。这也是函数式编程中经常提及的高阶函数的用法。为后面解释高阶函数做铺垫。对比下原来的做法,实际上就是在原来代码中(square tree) 变成(op tree),其他部分没有变化。题目实际上是想让我们将树的遍历与平方操作分离开,以方便我们实现树的其他操作,比如立方,自加之类的操作。题目的难点是理解op参数应该在什么时候调用。理解透以后这个题就非常简单。
2024-08-05 14:57:17
183
原创 练习2.30
最终能写出第二版,多亏了我沉下心思考了,map和square-tree的调用关系,并在repl窗口手工执行map 查看输出结果。并把square-tree传递给map ,执行提示错误,不知道脑子怎么突然跑去想返回值不对,然后又给map外层加了一个cons。map应该与square-tree两者相互使用,即square-tree 中使用map 遍历树,当发现不是list时,直接平方,当是list时 再次调用map即可。导致写了很多额外的代码,代码写出来,看上去居然和第一版没区别。
2024-08-04 15:44:07
60
原创 记录一个decimalFormat使用的问题
在工作中遇到页面显示的数据格式错误,两个条数据,一条显示正常,一条小数部分没了。用的相同的标签和pattern,去查查怎么回事,原来是理解错了pattern含义。错误pattern = “###,###.##”#是数位符,有数显示,没有数不显示,0自然不显示。正确pattern = “#,###.00”0也是数位,表示有数显示数,没数显示0。简单记录一下,省的下次遗忘。
2024-08-02 15:46:50
204
原创 习题2.24
说起来也简单,这是一个多层的列表,第一个元素是1 第二个元素是(2 ( 3 4))盒模型其实也很简单,只是没有好工具来画,临时手绘一下。树结构,看完盒模型就懂了。第二层第一个是2 第二个是 (3 4)没啥好说, 先看解释器给出的结果。第三层第一个是 3 第二个是4。
2024-07-27 22:41:14
73
原创 习题2.25~2.26
最外面的first 是从(7)中取出7,紧接着的rest 则是从(5 7)中取出(7),下一个frist则是在((5 7 )9) 中取出(5 7),接连两个rest,是 跳过 1 3 元素。所以我们想到的取数方式,和我们写出的代码,顺序是相反的。第二个,看看代码,是不是跟直觉的顺序不太一样,仔细观察,是不是方向恰好相反?第一个挺简单,也发现不了自己思维上的问题。没啥需要解释的,直接贴代码和执行结果。
2024-07-27 14:58:58
53
原创 习题2.22
第二次执行的时候,此时things内容为(3 4 5 6 7),而answer的内容已经变为(4),依此推理,在things内容为空的时候,answer里面的内容已经是(49 36 25 16 9 4),与正确的代码执行过程相比,仅仅是answer的入栈顺序不同导致的,实质上是先合并结果与先迭代后合并结果的区别。先不解释,直接贴出正确的代码,然后再进行执行过程分析,看看正确代码和他两次修改的代码 各自执行过程是什么样的。其实就是将nil作为cons的第一个参数链接到list导致的。
2024-07-26 17:15:02
296
原创 习题2.20
多说一点,这里为啥要定义一个内部函数,主要是因为不定参p 拿到的是个list ,递归的时候,会变成list list嵌套,生成(2 3 4 5 6)((3 4 5 6))这种结构进行参数传递,不方便代码的编写。第一次看见空指针异常,直接傻眼,看着执行出来的步骤,也没有什么奇怪的地方。惨痛的教训啊,本来几分钟就能搞定的问题,结果在不停的自我怀疑与否定中,改来改去,都是不细心的祸,那我们把题目正确的代码贴上来。这个题本来很简单,但是我却花了很长时间,因为盲写的第一版代码,一直报奇怪的错误。
2024-07-26 16:37:38
326
原创 习题2.21
很久没有写习题的代码了,倒不是懒得做习题了,是私事多,状态差,做了很多题,也不想发出来。这段代码非常有助于理解什么是深度优先,什么是广度优先。今天回复的还好,发一个。
2024-07-21 21:29:51
201
原创 习题2.18
题目很简单 将列表反序。用clojure来写,还是有点不习惯。忽然想起来,以前面试遇到过面试题,要求用递归函数对数组反序。原来就是想考察这些内容。因为源语言已经有提供reverse,我就偷懒改个简单的名rever ,上代码。确实挺挑战固有思维的。用了十多年的c系语言。
2023-10-14 14:45:41
211
原创 习题1.27
输出结果显示,对于每一个小于561的数字,他的561次方 和他与561的模相同,也就是通过了测试。对于一个非素数,执行结果显示为no,表明没有逃过费曼检查测试。
2023-08-06 10:22:52
160
原创 js实现sql中的groupby 功能,并提供几个聚合函数
写这段代码的目的呢,有两个,第一个是实现在前端页面对数据进行groupby,第二个就是练习我对函数式编程的理解。我不是一个前端程序员,学习函数式编程模式,主要是为了提高自己平时写代码的内聚性和降低耦合,减少代码复制。代码中有使用了一处for,这个在纯函数式编程中,是不能有的。另外,这个版本还有一个问题,就是avg求出来的值是不对的,暂时没有想好avg应该如何实现。
2023-07-24 18:13:53
521
原创 习题 1.26
根据以前学过的内容,我们知道 在做显示乘法的时候,是直接进行计算的,而在做函数调用的时候,是先进行表达式展开的,直接计算,就相当于2n个变量相乘,而展开后,相当于两个相乘的变量再n次方。这样会明显减少计算量,引发性能异常。问提与语言的执行模式相关,直接相乘,每个项的值,都会重新进行一次展开归并计算。我们先来看看题目要求,题目住说将 square 调用换成了(* x x),结果导致执行时间变慢。
2023-07-15 17:06:26
182
原创 习题1.25
结果不一致,具体原因,是因为这种方式是随机搜索素数的方法,会出现如此情况,这执行结果有点奇怪,需要再次检查代码逻辑及输出.实践出真知,运行看看。然后我们与原版的代码执行结果。
2023-07-15 16:53:26
161
原创 关于spring框架使用bean注解初始化的一点认识
框架在使用bean注解的方法得到对象后,会调用实现了InitializingBean接口的对象的afterPropertiesSet方法,如果方法内再调用,会有可能出现一些奇怪的行为。这个类的afterPropertiesSet方法,连续多次执行,会产生不一样的后果,不具有幂等性。在方法中new以后,调用setcrontaskList方法以后,很自然的调用了afterPropertiesSet方法。没啥想法了,开始各种无端猜疑,有些猜想,自己都不认可,也拿来试试,死马当活马医嘛。
2023-05-09 14:31:13
149
原创 电脑的世界,最慢的果然还是IO
其中FileUtils为同事封装的类,打开内容后发现代码仅仅是调用了apache的io包,追踪进去,发现Apache是先用outputstream打开文件,写入内容,后用IOUtils.closeQuietly函数关闭steam。回想自己写php年代的经验,这种情况,高概率是由于每次读写文件,都重新打开文件写完然后关闭文件导致的。因为数据量有200w以上,初步怀疑的是数据库慢拖累的。总结,封装有利于代码结构,但也隐蔽了很多细节,在性能优化的时候,有必要追寻底层实现逻辑,才能更高效的找出问题,提升效率。
2023-01-30 10:07:21
132
原创 关于nodejs调用c/c++代码的一些感悟
转win10系统,双系统的macair电脑,硬盘有点少,win10总共40G,安装个vc环境,我的硬盘就快爆了。打不开设备,也就没办法推进问题。受网上谋篇不知名的博客影响,写出如上代码,buf里面,怎么都获取不到数据,但是ret的返回值,却又是true,证明我们已经成功的调用到了dll文件的方法。关于vs,不知道为什么,ffi编译的时候,需要vs2013以上(不含2013),我的老花眼,居然看成只支持2013,一番折腾。关于nodejs,因为客户使用node 10.1,所以也是装了卸,吐了吃。
2022-12-02 14:51:07
846
原创 习题1.24
果然是人间悲剧,居然栈溢出了,我也不知道是什么情况。初步判定是代码问题。但是确实无法理解到题目的意图内容。如果后续能get到,我就来修改补充下。
2022-11-05 14:48:54
123
原创 习题1.23
运行结果依然如上一题,无法看出运算速度关系,但是可以肯定的是,壁纸不是2.为什么我也不知道哦。嗯 我也把系统的next贴上来吧,权当我在凑字数。之所以用了next-item 是因为next有语言提供的功能,为了区分,改成next-item。题目如上,依照题目意图实现函数如下。
2022-11-05 13:58:59
90
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人