吐槽下专业书籍真是不专业

2019-12-04 10:13:20 +08:00
 jyounn

昨天面试被拒说我数据结构不行,于是拿起《数据结构与算法分析 java 语言描述第三版》打算啃.结果第一章的例子就把我搞晕了.题干是“打印输出正整数的每一位”,书里提供的解决思路如下: 考虑正整数 n=76234,首先需要打印 7623,然后再打印 4.而当 0<=n<10,则直接打印.于是根据递归的思想得到:

方法 1
void printf_Every(int num){
	if (num >= 10){
		printf_Every(num / 10);
	}
	printf(num % 10);
}

认真考虑了递归的几个基本条件,怎么看都不满足有“基准情形”这一条. 百思不得其解.按照我的理解应该是这样:

方法 2
void printDigit(int n) {
   //基准情形
   if(n<10) {
       System.out.print(n);
   } else {
       //不断推进
       printDigit(n/10);
       System.out.print(n%10);
   }
}

测试了也没问题.转头思考了一下,方法 2 能简化成方法 1.这才明白过来.😷 我就吐槽下书本能不能按照书本自身的标准解释循序渐进地讲解问题.不要一上来就各种简化版、阉割版. 对待新人太不友好了.

9952 次点击
所在节点    程序员
76 条回复
loryyang
2019-12-04 19:57:48 +08:00
我觉得这样的例子挺好的,促使读者思考,虽然作者文章不写,但是通过代码传授你更多的东西。至于看不看得懂,如果看不懂,放到编辑器里面 debug 一下肯定能懂。如果这点能动性都没有,那看书也学不到太多东西
NotFoundEgg
2019-12-04 20:00:14 +08:00
专业的代码大都对新人不友好 你看各大框架的源码友好吗 过于友好就是冗余 否则为什么要学算法呢 还是提升自己吧
secondwtq
2019-12-04 20:40:12 +08:00
@shijingshijing 以 code size 为理由不是很可取吧 ...
Justin13
2019-12-04 20:50:48 +08:00
书上的更清晰,递归要么继续迭代,要么到达结束。很清晰,你的代码两个输出反而多余且难懂。
shijingshijing
2019-12-04 22:48:58 +08:00
@secondwtq
编译器在处理的时候,printf(num % 10); 这一句无论什么条件下都会执行,可能会有优化。
现在的 CPU 都有 Branch Prediction,第一种写法个人感觉会有利于 CPU 进行优化。

以上纯属个人瞎猜的,具体还得看生成的汇编代码是什么样的,实际测试结果是什么样。
silhouette
2019-12-05 00:18:25 +08:00
第一个更好理解啊,打印一个长串数字分成两步,第一步打印除最后一位外的所有高位,第二步打印最后一位。
Kasumi20
2019-12-05 01:17:46 +08:00
JS 一行代码搞定

n => n.toString().split("").forEach(it => console.log(it))
GeruzoniAnsasu
2019-12-05 01:58:21 +08:00
首先需要打印 7623,然后再打印 4
书的写法
先 print(76234/10)
再 print(4)

你的写法
System.out.print(n); //先看看能不能 print 4
printDigit(n/10); // 不能的话 print 7623
System.out.print(n%10);//最后 print4


“不专业!”

铪蛤蛤
jxie0755
2019-12-05 02:55:46 +08:00
小同学, 你这...........
你要是这么说的话.............连我这个两年前才第一次 hello world 的人, 都要开始飘飘然的认为自己不算新人了.................
exploreXin
2019-12-05 09:40:37 +08:00
这本书没读过,但是根据我读过的国外技术书籍的经验来看,老外都喜欢循序渐进的讲述知识,你看的只是第一章,坚持看下去很大肯能会有对前面章节算法的优化和深入讲解,当然也可能确实是作者功力不够,毕竟国外也是有东拼西凑出书赚钱的不良作者的嘛。
sunziren
2019-12-05 10:14:37 +08:00
顶山去报复社会。
qingluo
2019-12-05 10:45:21 +08:00
从 sonar 这种静态代码分析工具的角度上来看,方法 1 会被警告,方法 2 要优一些。
最近在学习 scala 从 fp 的角度上来看 2 个都不好(不满足尾递归优化)。而且更 java 的方式难道不是应该是
int a = 1234567;
Stream.of(String.valueOf(a))
.flatMap(s->s.chars().mapToObj(c-> (char) c))
.forEach(System.out::println);
l8g
2019-12-05 11:06:14 +08:00
@passerbytiny 别人能出书所以我就不能评价它不好?又是这种搞笑的理论。祝你以后买到的书看完之后都是五星好评。
ccpp132
2019-12-05 12:20:15 +08:00
@l8g 你也没读过啊。实际上这套书写的可好了......
passerbytiny
2019-12-05 13:43:48 +08:00
@l8g #63 哦
passerbytiny
2019-12-05 13:48:05 +08:00
A:所以你也就过过“误人子弟的书”的嘴瘾,别人能出书。(你比那个人差得远了)
B:我比别人差得远,我就不能说别人误人子弟了?

提问:B 的脑回路为何如此奇特。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/625756

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX