V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
WMutong
V2EX  ›  程序员

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

  •  
  •   WMutong · Mar 9, 2018 · 4102 views
    This topic created in 2975 days ago, the information mentioned may be changed or developed.

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

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

    function foo () {}
    foo();

    就是定义了函数然后马上执行,这么做一般是为了控制作用域。
    zzNucker
        10
    zzNucker  
       Mar 9, 2018
    这个 rob 不是函数,是个函数的返回值。

    (function(){})()

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

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

    通常写成这样:

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

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

    https://en.wikipedia.org/wiki/Immediately-invoked_function_expression
    WMutong
        13
    WMutong  
    OP
       Mar 9, 2018
    @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
       Mar 9, 2018
    @hansnow 对的对的就是这个,谢谢
    WMutong
        15
    WMutong  
    OP
       Mar 9, 2018
    @BearD01001 也感谢你来参与了我的问题,谢谢
    walleL
        16
    walleL  
       Mar 9, 2018
    为什么要套一层 memo? 没看明白
    KuroNekoFan
        17
    KuroNekoFan  
       Mar 9, 2018 via iPhone
    你这 iife 的话函数定义外面少了一层括号吧
    sunjourney
        19
    sunjourney  
       Mar 9, 2018
    用动规可破
    vincenttone
        20
    vincenttone  
       Mar 9, 2018
    写了一版递归的( python 有点水)
    https://gist.github.com/vincenttone/f2e754e62614cad0db2b5c9fde7bf70d

    至于 funcion(){}()的问题:
    x = function(){}
    x()
    转为匿名函数应该就是 funciton(){}()了吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1021 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 18:10 · PVG 02:10 · LAX 11:10 · JFK 14:10
    ♥ Do have faith in what you're doing.