Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
631 views
in Technique[技术] by (71.8m points)

recursion - Javascript add to string with each function call

I have the following situation where I have a function f which takes an argument input.

I want to be able to have f such that it satisfies the following output:

f('l') --> fl

f() --> fo

f()('l') --> fol

f()()('l') --> fool

f()()()('l') --> foool

I thought this would be achievable with:

function f(input) {
  let str = 'f'
  if (input) {
    return `${str}${input}`
  }
  str = `${str}o`
  return f()
}

However this ends up in an infinite loop. I also tried having f return a function, but this too does not work.

How can I write f in order to get my desired output while keeping the function stateless?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

In JS you can even achieve this dualitiy of a function also "being" a String. Yet this is nothing you should ever use in production code.

const f = function _f(prefix){
  const toString = () => prefix;
  return Object.assign(function(suffix="o"){ 
    return _f(prefix + suffix);
  }, {
    valueOf: toString,
    toString
  });
}("f");

console.log(""+f('l'))
console.log(""+f())
console.log(""+f()('l'))
console.log(""+f()()('l'))
console.log(""+f()()()('l'))

let foo = f()();
let fool = foo("l");
console.log(""+foo("l"));
console.log(""+fool);
console.log(""+foo("bar"));
console.log(""+fool("bar"));

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...