我遇到了一个问题,我们应该编写一个JS函数"func",它的行为假设如下所示
func("world") --> returns --> hiworld
func()("world") --> returns --> hiiworld
func()()("world") --> returns --> hiiiworld
func()()()("world") --> returns --> hiiiiworld
func()()()()("world") --> returns --> hiiiiiworld
func()()()()()("world") --> returns --> hiiiiiiworld
因此,它必须是可调用的,我们需要在hi和world之间添加"i",具体取决于它被调用的次数。我能够编写如下代码:-
function parent () {
let mid = ''
function func(param) {
if(param) {
let str = 'hi' + mid + param
mid = ''
return str
}
mid += 'i'
return func
}
return func
}
let func = parent()
但我无法满足测试用例:-
func() --> returns func
func()("world") --> returns --> hiiworld
我们不需要再次定义func变量。基本上,我们需要一种方法来跟踪在链接机制中调用func的次数。新呼叫应从开始计数。有人能提出一些关于我们如何实现这种行为的想法吗?
这是您需要的代码,请参阅下面的解释。
const func = (param = "") => {
const inner = (word = "") => {
if (word.length === 0) {
inc += 1;
return inner;
}
return "hi" + ("i".repeat(inc)) + word;
}
if (param.length !== 0) {
return "hiworld";
}
let inc = 1;
return inner;
}
下面的这个替代方案也会给出相同的输出
const func = (param="") => {
if (param.length !== 0) {
return "hiworld";
}
let inc = 1;
const inner = (word="") => {
if (word.length === 0) {
inc += 1;
return inner;
}
return "hi" + ("i".repeat(inc)) + word;
}
return inner;
}
func("world")
:我们将从第1行执行,并在的第12行停止。并且由于param是"世界我们只会返回"strong>";hiworldfunc()("world")
:现在没有传入param(调用func()
的第一部分(,因此将跳过10到12的行,innec.inc
将在第14行上为1,然后我们将inner
函数返回给func()
。既然内部现在被返回到CCD_ 7并用参数">"调用;世界。即func()
将返回inner
,我们现在说inner("world")
(这相当于第一部分func() == inner)
的func()("world")
。这意味着单词是"世界">,因为它是internal的参数。第3行到第6行将不会执行,所以我们返回"hiiworld"
。inner.inc``"i"
意味着复制"i"
inner.inc
的次数,目前只有一次func()()("world")
:第一部分func()
返回inner
(inner.inc
当前为1
(。2nd部分func()()
返回inner
,然后用空参数调用inner
。即字将是一个空字符串,第3行至第6行现在将被执行,将internal.inc递增至2,并再次返回inner
,同时忽略行7。第三个部分:由于第二个nternal.inc并返回了inner
,因此我们使用返回的inner
并调用参数";世界。哪个单词现在将是";世界和的第3行至第6行现在被跳过,第7行
这种情况一直持续下去。其想法是,只要我们不提供参数字,internal.inc就会在第4行继续增加。当我们提供参数时,第7行现在被执行,我们就完成了。
如果需要,这里是Python的等价
def func(param=""):
if param:
return "hiworld"
def inner(word=""):
if word:
inner.inc += 1
return inner
return "hi" + inner.inc * "i" + word
inner.inc = 1
return inner