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

2018-03-09 09:40:07 +08:00
 WMutong

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

用一个数组来表示这些房子的金钱数量,请你完成 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(){}()的用法,我貌似有些混乱了。对这个答案的逻辑不是很明白,有谁可以帮忙讲解下吗,谢谢

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

function foo () {}
foo();

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

(function(){})()

就是立即执行这个函数
BearD01001
2018-03-09 10:06:23 +08:00
@jhdxr 刚回复完突然想到了这种情况,确实是我考虑不周😅
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
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
2018-03-09 10:13:55 +08:00
@hansnow 对的对的就是这个,谢谢
WMutong
2018-03-09 10:15:25 +08:00
@BearD01001 也感谢你来参与了我的问题,谢谢
walleL
2018-03-09 10:34:57 +08:00
为什么要套一层 memo? 没看明白
KuroNekoFan
2018-03-09 10:59:45 +08:00
你这 iife 的话函数定义外面少了一层括号吧
ipwx
2018-03-09 11:00:45 +08:00
sunjourney
2018-03-09 14:01:26 +08:00
用动规可破
vincenttone
2018-03-09 20:07:06 +08:00
写了一版递归的( python 有点水)
https://gist.github.com/vincenttone/f2e754e62614cad0db2b5c9fde7bf70d

至于 funcion(){}()的问题:
x = function(){}
x()
转为匿名函数应该就是 funciton(){}()了吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/436382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX