• 请不要在回答技术问题时复制粘贴 AI 生成的内容
WMutong
V2EX  ›  程序员

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

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

    function foo () {}
    foo();

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

    (function(){})()

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

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

    通常写成这样:

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

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

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

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