【发布时间】:2018-09-04 10:16:04
【问题描述】:
我有一段代码可以通过在给定字符串的字母之间放置空格来生成所有可能的字符串,该代码使用递归来实现这一点。这是我的代码(它是C++ source,我已经适应了 JavaScript,它按预期工作):
var genStringsUtil = function (str,buf,i,j,n){
if(n == i){
buf[j] = " ";
console.log(buf.join(""));
return;
}
buf[j] = str[i];
genStringsUtil (str,buf,i+1,j+1,n);
buf[j] = " ";
buf[j+1] = str[i];
genStringsUtil (str,buf,i+1,j+2,n);
}
var genStrings = function(s){
var str = s;
var n =str.length;
var buf = [];
buf[0] = str[0];
genStringsUtil (str,buf,1,1,n);
};
function main(){
genStrings("ABCDE");
}
main();
现在,我已经这样修改了它,它仍然有效:
var genStrings = function (str,buf,i,j,n){
if(n == i){
buf[j] = " ";
console.log(buf.join(""));
return;
}
buf[j] = str[i];
genStrings (str,buf,i+1,j+1,n);
buf[j] = " ";
buf[j+1] = str[i];
genStrings (str,buf,i+1,j+2,n);
}
!function(s){
var str = s;
var n =str.length;
var buf = [];
buf[0] = str[0];
genStrings (str,buf,1,1,n);
}("ABCDE");
但是,当我将最后一部分更改为(带括号的 IIFE)时:
(function(s){
var str = s;
var n =str.length;
var buf = [];
buf[0] = str[0];
genStrings (str,buf,1,1,n);
})("ABCDE");
我得到一个错误:
TypeError: j 未定义
如果我将右括号放在 ("ABCDE") 之后,如下所示:
(function(s){
var str = s;
var n =str.length;
var buf = [];
buf[0] = str[0];
genStrings (str,buf,1,1,n);
}("ABCDE"));
我得到另一个错误:
TypeError: genStrings 不是函数
我一直认为 IIFE 用 !或括号是同一件事,但显然不是。所以我的问题基本上是在这三种情况下发生了什么不同?递归是问题吗?
希望我的信息不要太长。
感谢您的帮助。
【问题讨论】:
-
你忘记了分号,所以
genStrings因为你的括号而被立即调用。 VTC'ing 错字。考虑使用 linter -
谢谢。我没有看到我在哪里缺少分号?根据右括号的位置,我会收到两条不同的错误消息。如果它在参数 ("ABCDE") 之前,即使我在 ("ABCDE")之前添加分号,我也会得到 j is undefined >。对于第二种情况,我看不到我缺少分号的地方。
-
整个
genStrings函数后面需要一个分号,否则它会被立即调用,因为function() { }后面紧跟着(...)(解释为调用) -
对不起,我在验证我的答案时才意识到你的意思。现在可以了。感谢您的帮助。最后一个问题,你所说的 VTC'ing as typo 是什么意思
-
VTC = 投票结束。 (错字问题与 SO 无关,应关闭)
标签: javascript recursion iife