有一道题: 你是一个盗窃专家,某一天晚上你要去盗窃某一条街道的一排房子。这些房子都有相连的防盗系统,如果你把相邻的两家都偷了那么就会触发报警器。
用一个数组来表示这些房子的金钱数量,请你完成 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(){}()的用法,我貌似有些混乱了。对这个答案的逻辑不是很明白,有谁可以帮忙讲解下吗,谢谢
1
xml123 2018-03-09 09:53:01 +08:00 via Android 1
不懂这个语言,不过这道题我的思路是对 n 个元素,取第一个+后 n-2 个能取的最大值,与第二个+后 n-3 个能取的最大值,二者比较取大值,然后递归即可。不知道和你给的代码是不是一样的方法。
|
2
nazor 2018-03-09 09:56:05 +08:00
动态规划
|
3
WMutong OP @xml123 是的,思路是一样的。这个是我看到的别人的答案,用的 javascript 中 ES6 的语法。我对其中的 function(){}()用法感觉不是很理解。
|
4
VDimos 2018-03-09 10:00:41 +08:00 via Android
iife,立即执行函数
|
5
hansnow 2018-03-09 10:01:00 +08:00 1
没看题,如果只是 function(){}()的话,这叫 IIFE 吧
https://developer.mozilla.org/zh-CN/docs/Glossary/%E7%AB%8B%E5%8D%B3%E6%89%A7%E8%A1%8C%E5%87%BD%E6%95%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F |
6
BearD01001 2018-03-09 10:01:27 +08:00 via iPhone
这道题难道不是数组奇偶索引的和值比大小吗? P.S. 未细看 lz 给出的代码实现,不过感觉是解题人想多了,或是我理解有误?
|
7
BearD01001 2018-03-09 10:05:12 +08:00 via iPhone
@BearD01001 是我理解有误,抱歉。function () {} () 是立即执行函数,楼上有答主给出 ref。
|
8
jhdxr 2018-03-09 10:05:13 +08:00
@BearD01001 5,1,1,5
|
9
qiutc 2018-03-09 10:06:07 +08:00
function(){}()
相当于 function foo () {} foo(); 就是定义了函数然后马上执行,这么做一般是为了控制作用域。 |
10
zzNucker 2018-03-09 10:06:22 +08:00
这个 rob 不是函数,是个函数的返回值。
(function(){})() 就是立即执行这个函数 |
11
BearD01001 2018-03-09 10:06:23 +08:00 via iPhone 1
@jhdxr 刚回复完突然想到了这种情况,确实是我考虑不周😅
|
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 |
13
WMutong OP @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 |
15
WMutong OP @BearD01001 也感谢你来参与了我的问题,谢谢
|
16
walleL 2018-03-09 10:34:57 +08:00
为什么要套一层 memo? 没看明白
|
17
KuroNekoFan 2018-03-09 10:59:45 +08:00 via iPhone
你这 iife 的话函数定义外面少了一层括号吧
|
18
ipwx 2018-03-09 11:00:45 +08:00
|
19
sunjourney 2018-03-09 14:01:26 +08:00
用动规可破
|
20
vincenttone 2018-03-09 20:07:06 +08:00
写了一版递归的( python 有点水)
https://gist.github.com/vincenttone/f2e754e62614cad0db2b5c9fde7bf70d 至于 funcion(){}()的问题: x = function(){} x() 转为匿名函数应该就是 funciton(){}()了吧 |