资讯专栏INFORMATION COLUMN

经典的递归面试题

enali / 3640人阅读

摘要:递归闭包解决也就是存在数组中,再次循环时,如果数组中已经存在,就返回数组中的值,大大减少了递归调用函数的次数第位只是占位,从第一位开始算起如果中存在,返回这个值普通普通循环解决这个问题是性能最好的。

细胞分裂

</>复制代码

  1. 细胞分裂 有一个细胞 每一个小时分裂一次,一次分裂一个子细胞,第三个小时后会死亡。那么n个小时候有多少细胞?
    这个问题的核心就是三个小时为一个周期

</>复制代码

  1. // 每三个小时为一个周期 , 第四个小时就 go die 了。
  2. // 方法一
  3. // 第一个小时,只有a态细胞;第二个小时,a态细胞分裂,原来的a态细胞变成了b态细胞,分裂出来的细胞变成了新的a态细胞;第三个小时,a态细胞继续分裂变成b态细胞和新的a态细胞,b态细胞分裂变成c态细胞和a态细胞;第四个小时,a、b、c态细胞都会分裂,并且按照之前的规律转变。得出下面的结论
  4. // a 初始态 一个小时 前一个小时的 a+b+c
  5. // b 幼年态 两个小时 前一个小时的 a
  6. // c 成熟态 三个小时 前一个小时的 b
  7. function allCell(n){
  8. // a态细胞
  9. let aCell = function(n){
  10. if(n==1){
  11. return 1;
  12. }else{
  13. return aCell(n-1)+bCell(n-1)+cCell(n-1);
  14. }
  15. }
  16. // b态细胞
  17. let bCell = function(n){
  18. if(n==1){
  19. return 0;
  20. }else{
  21. return aCell(n-1);
  22. }
  23. }
  24. // c态细胞
  25. let cCell = function(n){
  26. if(n==1||n==2){
  27. return 0;
  28. }else{
  29. return bCell(n-1);
  30. }
  31. }
  32. return aCell(n)+bCell(n)+cCell(n)
  33. }
  34. console.log(allCell(10))
  35. // 方法二
  36. // 这个方法就是分成了 活着的 和 死亡的
  37. function cell(hour){
  38. // 活着的细胞
  39. function livecell(hour){
  40. if(hour<4){
  41. // 前三个小时没有死亡的细胞 成2的n-1次方增长
  42. return Math.pow(2,hour-1)
  43. }else{
  44. // 从第四个小时开始有死亡的细胞
  45. // 活着的细胞 = 前一个小时活着的细胞 - 这个小时死去的细胞
  46. return livecell(hour-1)*2 - diecell(hour)
  47. }
  48. }
  49. // 死亡的细胞
  50. function diecell(hour){
  51. if(hour<4){
  52. // 前三个小时没有死亡的细胞
  53. return 0
  54. }else{
  55. // 因为三个小时一个周期
  56. // 也就是每三个小时,(n-3)时的细胞就会死完
  57. // 那么 这个小时(n)死去的细胞 + 上个小时(n-1)死去的细胞 + 前两个小时(n-2)死去的细胞 = 前三个小时(n-3)活着的细胞
  58. return livecell(hour-3) - diecell(hour-1) - diecell(hour-2)
  59. }
  60. }
  61. return livecell(hour)
  62. }
  63. console.log(cell(10))
斐波那契数列

</>复制代码

  1. 又称兔子数列,是以兔子繁殖为例,得出这样一个数列:1,1,2,3,5,8... 指从第三个值开始,每个值都是前两个值的和。

</>复制代码

  1. // 递归
  2. let a = 0;
  3. function tu(num){
  4. a++
  5. if(num==1||num==2){
  6. return 1
  7. }
  8. let nums = tu(num-1)+tu(num-2)
  9. return nums
  10. }
  11. console.log(tu(8),a)
  12. // 闭包解决
  13. // 也就是存在数组中,再次循环时,如果数组中已经存在,就返回数组中的值,大大减少了递归调用函数的次数
  14. var count2=0;
  15. var fiba = (function(){
  16. var arr = [0,1,1]; //第0位只是占位,从第一位开始算起
  17. return function(n){
  18. count2++;
  19. var res=arr[n];
  20. if(res){// 如果arr中存在,返回这个值
  21. console.log(res,"----")
  22. return res;
  23. }else{
  24. console.log(arr[n],"+++++")
  25. arr[n]=fiba(n-1)+fiba(n-2);
  26. return arr[n];
  27. }
  28. }
  29. })();
  30. console.log(fiba(8),count2)
  31. // 普通
  32. // 普通循环解决这个问题是性能最好的。
  33. let a = 1;
  34. let b = 1
  35. let c;
  36. function tu(num){
  37. for(let i=0;i
  38. 64格子
  39. </>复制代码

    1. 有 64 个格子,第一个格子放一粒麦子,第二个放2粒,第三个放4粒...每个格子都是前边的两倍。一共有多少粒?
  40. </>复制代码

    1. let sum = 0
    2. let start = 1;
    3. let end = 0;
    4. function tow(){
    5. if(end>=64){
    6. return false
    7. }
    8. sum+=start
    9. start*=2
    10. end++
    11. tow()
    12. }
    13. tow()
    14. console.log(sum)
  41. 使用递归实现数组快速排序方法
  42. </>复制代码

    1. 这个问题的核心思想是 取中间值,然大的放一边,小的放一边,然后再对两边执行一样的操作,也就是递归了。
  43. </>复制代码

    1. var mysort = function(arr){
    2. // 结束条件
    3. if(arr.length<=1){
    4. return arr
    5. }
    6. // 找基准值 数组中间值
    7. // 求下标
    8. var center = Math.floor(arr.length/2)
    9. var jZ = arr.splice(center,1)[0]
    10. // 创建两个空数组
    11. var left = [] , right = [];
    12. // 循环数组,并进行比较
    13. for(var i=0;i
    14. 九九乘法表
    15. </>复制代码

      1. // 递归
      2. function num(nums){
      3. if(nums==1){
      4. console.log("1x1=1")
      5. }else{
      6. num(nums-1)
      7. for(var i=1,str="";i<=nums;i++){
      8. str += `${i}x${nums}=`+i*nums+" "
      9. }
      10. console.log(str)
      11. }
      12. }
      13. num(9)
      14. // 循环
      15. for(var i=1;i<10;i++){
      16. let str = ""
      17. for(var j=1;j<10;j++){
      18. if(i>=j){
      19. str += `${j}x${i}=`+i*j+" "
      20. }
      21. }
      22. console.log(str)
      23. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102825.html

相关文章

  • 前端经典面试总结

    摘要:接着我之前写的一篇有关前端面试题的总结,分享几道比较经典的题目第一题考点作用域,运算符栗子都会进行运算,但是最后之后输出最后一个也就是那么其实就是而且是个匿名函数,也就是属于,就输出第二和第三个都是类似的,而且作用域是都是输出最后一个其实就 接着我之前写的一篇有关前端面试题的总结,分享几道比较经典的题目: 第一题: showImg(https://segmentfault.com/im...

    BlackMass 评论0 收藏0
  • 高级函数技巧-函数柯里化

    摘要:如果你对函数式编程有一定了解,函数柯里化是不可或缺的,利用函数柯里化,可以在开发中非常优雅的处理复杂逻辑。同样先看简单版本的方法,以方法为例,代码来自高级程序设计加强版实现上面函数,可以换成任何其他函数,经过函数处理,都可以转成柯里化函数。 我们经常说在Javascript语言中,函数是一等公民,它们本质上是十分简单和过程化的。可以利用函数,进行一些简单的数据处理,return 结果,...

    shixinzhang 评论0 收藏0
  • 前端面试收集,持续更新中

    摘要:对于所访问的每个元素,函数应该将该元素传递给所提供的回调函数。 HTML 在线阅读Github地址 题目列表 HTML HTML和XHTML的区别 Html的语义化 Doctype的文档类型 cookie、sessionSttorage、localStory区别 HTML全局属性(global attribute)有哪些? 常见的浏览器内核有哪些? 介绍一下你对浏览器内核的理解?...

    kgbook 评论0 收藏0
  • 前端面试收集,持续更新中

    摘要:对于所访问的每个元素,函数应该将该元素传递给所提供的回调函数。 HTML 在线阅读Github地址 题目列表 HTML HTML和XHTML的区别 Html的语义化 Doctype的文档类型 cookie、sessionSttorage、localStory区别 HTML全局属性(global attribute)有哪些? 常见的浏览器内核有哪些? 介绍一下你对浏览器内核的理解?...

    2json 评论0 收藏0
  • 前端面试收集,持续更新中

    摘要:对于所访问的每个元素,函数应该将该元素传递给所提供的回调函数。 HTML 在线阅读Github地址 题目列表 HTML HTML和XHTML的区别 Html的语义化 Doctype的文档类型 cookie、sessionSttorage、localStory区别 HTML全局属性(global attribute)有哪些? 常见的浏览器内核有哪些? 介绍一下你对浏览器内核的理解?...

    adam1q84 评论0 收藏0

发表评论

0条评论

enali

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<