V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WMutong
V2EX  ›  程序员

一个关于 function(){}()的问题,大神们谁能帮我讲解下,谢谢

  •  
  •   WMutong · 2018-03-09 09:40:07 +08:00 · 3201 次点击
    这是一个创建于 2211 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一道题: 你是一个盗窃专家,某一天晚上你要去盗窃某一条街道的一排房子。这些房子都有相连的防盗系统,如果你把相邻的两家都偷了那么就会触发报警器。

    用一个数组来表示这些房子的金钱数量,请你完成 rob 函数,计算出在不触发报警器的情况下最多能偷多少钱。例如: rob([1, 2, 3]) // => 4

    答案: const rob = ((memo) => { const _rob = (nums)=>{

      let n = nums.length 
      if(!n) return 0     
    
      if(!memo[n-1]){
        console.log(nums.slice(0, -1), nums.slice(0, -2), nums[n - 1],nums);
        if(n===1) memo[0] = nums[0]
        else if(n===2) memo[1] = Math.max(nums[0],nums[1])
        else memo[n-1]
            = Math.max(_rob(nums.slice(0,-1)), _rob(nums.slice(0,-2))+nums[n-1])
    
        console.log(memo);
      }
    
      return memo[n-1]
    }
    return _rob
    

    })([]);

    console.log(rob([1,3,7,3,2,9,10,1]));//20

    对于 function(){}()的用法,我貌似有些混乱了。对这个答案的逻辑不是很明白,有谁可以帮忙讲解下吗,谢谢

    20 条回复    2018-03-09 20:07:06 +08:00
    xml123
        1
    xml123  
       2018-03-09 09:53:01 +08:00 via Android   ❤️ 1
    不懂这个语言,不过这道题我的思路是对 n 个元素,取第一个+后 n-2 个能取的最大值,与第二个+后 n-3 个能取的最大值,二者比较取大值,然后递归即可。不知道和你给的代码是不是一样的方法。
    nazor
        2
    nazor  
       2018-03-09 09:56:05 +08:00
    动态规划
    WMutong
        3
    WMutong  
    OP
       2018-03-09 09:58:12 +08:00
    @xml123 是的,思路是一样的。这个是我看到的别人的答案,用的 javascript 中 ES6 的语法。我对其中的 function(){}()用法感觉不是很理解。
    VDimos
        4
    VDimos  
       2018-03-09 10:00:41 +08:00 via Android
    iife,立即执行函数
    hansnow
        5
    hansnow  
       2018-03-09 10:01:00 +08:00   ❤️ 1
    BearD01001
        6
    BearD01001  
       2018-03-09 10:01:27 +08:00 via iPhone
    这道题难道不是数组奇偶索引的和值比大小吗? P.S. 未细看 lz 给出的代码实现,不过感觉是解题人想多了,或是我理解有误?
    BearD01001
        7
    BearD01001  
       2018-03-09 10:05:12 +08:00 via iPhone
    @BearD01001 是我理解有误,抱歉。function () {} () 是立即执行函数,楼上有答主给出 ref。
    jhdxr
        8
    jhdxr  
       2018-03-09 10:05:13 +08:00
    @BearD01001 5,1,1,5
    qiutc
        9
    qiutc  
       2018-03-09 10:06:07 +08:00
    function(){}()
    相当于

    function foo () {}
    foo();

    就是定义了函数然后马上执行,这么做一般是为了控制作用域。
    zzNucker
        10
    zzNucker  
       2018-03-09 10:06:22 +08:00
    这个 rob 不是函数,是个函数的返回值。

    (function(){})()

    就是立即执行这个函数
    BearD01001
        11
    BearD01001  
       2018-03-09 10:06:23 +08:00 via iPhone   ❤️ 1
    @jhdxr 刚回复完突然想到了这种情况,确实是我考虑不周😅
    brickyang
        12
    brickyang  
       2018-03-09 10:06:24 +08:00
    这就是 JavaScript 的立即执行函数( IIFE )。等效于:

    let a = function(arg) {};
    a([]);

    通常写成这样:

    (function(arg) {})([])

    第一个括号是函数声明。
    第二个括号是函数调用,括号里是调用时传的参数。

    https://en.wikipedia.org/wiki/Immediately-invoked_function_expression
    WMutong
        13
    WMutong  
    OP
       2018-03-09 10:12:39 +08:00
    @BearD01001 我刚开始也是这么认为的,但并不是。比如说:
    数组 [1 ,3 ,7 ,3 ,11 ,9 ,2 ,10 ]
    奇数相加 1+7+11+2= 21
    偶数相加 3+3+9+10=25

    奇偶最大值 25
    实际最大值 10+11+7+1=29
    WMutong
        14
    WMutong  
    OP
       2018-03-09 10:13:55 +08:00
    @hansnow 对的对的就是这个,谢谢
    WMutong
        15
    WMutong  
    OP
       2018-03-09 10:15:25 +08:00
    @BearD01001 也感谢你来参与了我的问题,谢谢
    walleL
        16
    walleL  
       2018-03-09 10:34:57 +08:00
    为什么要套一层 memo? 没看明白
    KuroNekoFan
        17
    KuroNekoFan  
       2018-03-09 10:59:45 +08:00 via iPhone
    你这 iife 的话函数定义外面少了一层括号吧
    sunjourney
        19
    sunjourney  
       2018-03-09 14:01:26 +08:00
    用动规可破
    vincenttone
        20
    vincenttone  
       2018-03-09 20:07:06 +08:00
    写了一版递归的( python 有点水)
    https://gist.github.com/vincenttone/f2e754e62614cad0db2b5c9fde7bf70d

    至于 funcion(){}()的问题:
    x = function(){}
    x()
    转为匿名函数应该就是 funciton(){}()了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1193 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:15 · PVG 02:15 · LAX 11:15 · JFK 14:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.