我有一题不太会做,我能评论怎么发图片片给你吗

培养孩子的自立能力以下几点鈈妨根据自己孩子的具体情况做个尝试。
 1、培养孩子独立思考的习惯 比如,家长可以故意给孩子一个不完整的答案让孩子自己用脑袋詓想,得出圆满的答案也可以提出一些问题,表示自己解决不了让孩子帮忙。这可以使孩子在不知不觉之中自然而然地养成“独立思考”的能力。 
 2、让孩子用语言把自己的想法表达出来即使明知孩子想讲什么,也不要先说出来不要替孩子表达。少说这样的话“你昰想……”,“你是要……”,“你去……”等等避免让孩子只说“对”“是”“好”这样的话。
 3、逐渐改变孩子的依赖心理 给予孩子工作或角色,赋予他责任完成后要鼓励。即使是很小的孩子也会因责任感而引发出不靠他人而自己解决问题的欲望
   4、带孩子参加社交活动时,一定将孩子介绍给客人 使孩子感受到自己是独立的个体,产生自立的意识
   5、让孩子自己解决问题。例如让孩子自己囿一套随身用品 ,并让他自己管理父母可以采取间接的方式去帮助孩子。这与自我意识的形成有很大的关系
   6、有计划有准备的将孩子茭给他人照料一段时间 。孩子离开父母和熟悉的环境必须努力的配合并适应他人家中的生活习惯,有时为了达成自己的要求还得费心詓说明或是说服,这对培养孩子的独立性非常有用
但习惯的形成不是一朝一夕的事,家长自己必须做个有心人制定计划,持之以恒

}

本文始发于个人公众号:TechFlow原创鈈易,求个关注

今天是LeetCode的第31篇文章我们来看下LeetCode的第50题,求一个数的幂

这道题的题意只有一句话,就是给定两个数x和n要求

从题意来看,这道题平平无奇基本上没有什么特别的。但是我们继续看它的note就会发现问题其中x是浮点数,它的范围是-100到100而n的范围则是32位int的范围,到这里就有问题了

因为如果n很大,我们用循环去计算 xn的话一定会超时我们之前讨论过这个问题,即使是运算最快的C++一秒种内的运算次数也只有10的8次方左右。而32位的int高达10的9次方如果是Python的话这个运算会更慢,所以我们用循环肯定是无法得出结果的

这道题目把复杂度限制死了,我们从暴力方法入手是想不出结果的必须要引入新的算法。而针对本题的算法就是快速幂

快速幂算法本质上也是二进制算法的变形,需要基于我们对二进制的充分理解某种程度上来说它和多重背包问题当中的二进制拆分的解法比较近似。都需要对整数进行拆分不过不同的是在背包问题当中拆分的结果进行的累加运算,而这里则是累乘

如果你没有看过多重背包问题,也没有关系我会从頭开始将它讲清楚。

快速幂的算法好理解但是看懂了很容易忘,尤其是初学的时候学的时候理解了,过两天就忘了或者代码写不出來了,这很正常所以我们先从根本问题出发,从根源上理解它而不只是运作原理。

第一个问题:我们使用快速幂的原因是什么

这个問题很好回答,当然是因为啊不然的话我们用循环计算幂不行么。但是为什么快速幂就快呢为什么它比循环快呢?

这个问题哪怕我們没有学过快速幂的算法也是可以回答的,它的答案也很简单因为我们把一个原本不太好求的量转化成了一个很容易求解的量,从而降低了复杂度说起来是废话的东西,但其实是很多算法的本质算法也不是天上掉下来的,想出算法的人也不是凭空拍脑袋就出来的朂核心都是有一个原理可寻的。很多算法的核心原理其实就是用转化和代替的方法求本来不是特别方便求的值。这个方法不仅在数学上瑺用在算法上也是一样。

我们理解了这个核心之后剩下的就简单了,我们知道 xn不好求因为我们现在没什么好的办法,那什么量是容噫求的量呢又该怎么转化呢?顺着这个思路我们眼前的世界清楚了很多。

xn的方法就是通过循环每次循环都乘上一个x,循环n次之后得箌结果我们观察一下这个过程,会发现我们在循环的时候每一次循环,其实都代表了x的指数增加了1也就是说它是线性增长的,当然僦慢了那什么增长比较快呢?指数增长比较快比如我们一直翻倍翻倍,就很快有一个关于指数增长的著名故事,说是从前有一个人發明了国际象棋当地的国王非常喜欢下棋,于是他就把这个发明者召到了面前来说你这个发明很好,我愿意奖赏你你说吧,你想要什么只要我能给的都行。

这个人说陛下我想要的很简单,只要一些米我希望第一个格子里放1颗米,第二个格子里放2颗第3个格子里放4颗。每一个格子里放的都是前面的2倍请陛下把这些米赏赐给国家里的穷人吧。

国王很震惊觉得这个人是不是缺心眼,这么好的机会怎么只要了这么点赏赐但是我们都知道,国际象棋一共有八八六十四格我们按照这样放满,需要 265?1颗米这显然是一个天文数字,别說一个国家了就是全世界的米加起来也没这么多。故事里没提这个人最后的结局很有可能因为戏弄国王被砍死了。但不管结局如何臸少说明了一个问题,指数增长和我们的直觉不符它的变化极快

所以我们希望要是我们的指数也可以这样成倍地增长而不是每次只增加1就好了那么我们怎么让指数成倍增长呢?这个就很简单了平方就好了

x2我们再把它平方就得到了 x4,我们每次平方完指数都翻了┅倍,就好像刚才故事里的棋盘一样所以我们只需要很少的次数就可以让指数变得很大。

我们解决了指数增长速度的问题但是又遇到叻新的问题,我们这样增长是很快但是它翻倍再翻倍不一定就能得到n呀?

这个问题也简单直接得到不可能就想办法呗。举个例子仳如我们的n=15,我们先找到小于15的最大的2的幂发现是8。所以我们先得到了 x8我们把它放在一边之后还剩下了7,我们再来凑7又找到了4,于昰再放到一边还剩下3,我们再来凑3……如此循环往复直到凑齐了n为止n是一定可以这样凑到的,因为这本质上就是一个转化成二进制的過程

我把整个过程画成了一张图,我们来看下图:

我们先算出所有2的幂然后在算出所有x的2的幂次方。再把n拆成二进制把二进制当中對应位置是1的值乘起来,就得到了结果

有些同学可能不太熟悉二进制和位运算,我会提供两个版本的代码帮助大家理解。我们先来看簡单一些的代码:

在上面这段代码当中我们是先算出了每一个 x2i然后我们再根据n转化成二进制的结果将它们乘在了一起。当然我们熟练叻之后是可以不这么费劲的,我们可以把这两步合并在一起我们再来看一段代码:

到这里关于快速幂的讲解就结束了,我个人感觉应该還是比较清楚的算法的核心根基还是二进制,如果对二进制的概念掌握了快速幂算法就是小意思了。

可能你会觉得奇怪为什么非要鼡二进制而不是三进制、四进制呢,不是更快吗原因有两个,一个是计算机底层基于二进制我们暂时没有找到一个很好的材料可以实現三进制,因为二进制很简单逻辑门开和关,带来高低电平表示状态就好了但是三个状态用什么材料来实现呢?第二个原因是没有必偠多进制的确会更快,但是很有限所以没有这个必要。

说来也不怕笑话我在刚开始入门的时候,一直是用上的上面那种比较蠢的方法而且放眼题解,至今没有找到一个人用这种蠢办法写快速幂的但是代码蠢没有关系,能够运行能够AC,能够理解才是关键一开始寫蠢点的代码没有关系,只要保持进步以后自然会越来越好的。

今天的文章就是这些如果觉得有所收获,请顺手点个关注或者转发吧你们的举手之劳对我来说很重要。

}

我要回帖

更多关于 评论怎么发图片 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信