【问题标题】:Can this problem be solved using functional programming only?仅使用函数式编程可以解决此问题吗?
【发布时间】:2021-10-06 13:53:52
【问题描述】:

提示是:

创建一个接收字符串并返回字符串的“URL 版本”的函数。这仅涉及用 %20 替换空格。

它要求使用递归来解决问题,并且不允许使用 .replace。 这是我的解决方案,但我知道 ouputArray 正在发生变异。有没有其他方法可以在没有突变的情况下解决这个问题?

let inputString = "hello world I am fine";
let outputArray = [];

let stringToUrl = (inputString, n) => {
inputArray = [...inputString]
  if(n < inputArray.length) {
    if(inputArray[n] !== " ") {
        outputArray.push(inputArray[n])
      return stringToUrl(inputArray, n+1)
      } 
      else {
      outputArray.push("%20")
      return stringToUrl(inputArray, n+1)
      }
    } 
      return outputArray.join('');
  }
console.log(stringToUrl(inputString, 0))

【问题讨论】:

    标签: javascript arrays string functional-programming immutability


    【解决方案1】:

    是的,您可以使用 FP 执行此操作。与How do I ask and answer homework questions? 保持一致,我不会用代码回复,而是用指针回复。

    如果您没有使用 FP 执行此操作(但仍然必须自己编写而不是使用字符串 replace 方法等),您可能会使用循环来构建一个新字符串,通过循环原始字符串逐个字符,或者将原始字符添加到新字符串中,或​​者将%20 添加到它。

    在 FP 中,循环通常是通过递归完成的,而您的指令是使用递归,所以我们将改为这样做。

    您的函数应该处理给定字符串中的第一个字符(保留它或将其替换为 %20),如果该字符是 only 字符,则只需返回更新后的“字符;"否则,它应该返回更新的字符,然后返回将字符串的 rest (除第一个字符之外的所有字符)再次通过您的函数的结果。这将通过递归遍历整个字符串,构建新字符串。 (不需要数组,字符串连接和substring 应该没问题。)

    【讨论】:

      【解决方案2】:

      在这里,我对您的代码进行了一些更改。希望这能解决您的问题。 我不必使用第二个数组,而是对原始数组进行更改。

      let inputString = "hello world I am fine";
      let stringToUrl = (inputString, n) => {
      inputArray = [...inputString]
        if(n < inputArray.length) {
          if(inputArray[n] === " ") {
              inputArray[n] = "%20"
            return stringToUrl(inputArray, n+1)
          } 
          else {
            return stringToUrl(inputArray, n+1)
            }
          } 
            return inputArray.join('');
        }
      console.log(stringToUrl(inputString, 0))
      

      【讨论】:

        【解决方案3】:
        const replace = (char: string) => char === ' ' ? '%20' : char;
        
        const convert = (str: string, cache = ''): string => {
            const [head, ...tail] = str;
        
            return head
                ? convert(
                    tail.join(''),
                    cache.concat(replace(head))
                )
                : cache
        }
        
        const result = convert("hello world I am fine") // hello%20world%20I%20am%20fine
        

        Playground

        我希望这项任务与语言无关,因为就递归优化而言,JS 并不是最佳选择。

        【讨论】:

          【解决方案4】:

          一种选择是调用stringToUrl 并使用内部递归函数,利用默认参数将变量的值作为函数参数传递。

          例如使用箭头函数,并将函数作为参数传递,以检查是否将 %20 添加到带有最终字符的数组中:

          const stringToUrl = str => {
              const func = (
                  s,
                  r = "",
                  c = s.charAt(0),
                  f = () => r += c === ' ' ? '%20' : c
              ) => s.length ? f() && func(s.substr(1), r) : r
          
              return func(str)
          }
          
          console.log(stringToUrl("hello world I am fine"));
          

          输出

          hello%20world%20I%20am%20fine
          

          const stringToUrl = str => {
            const func = (
              s,
              r = "",
              c = s.charAt(0),
              f = () => r += c === ' ' ? '%20' : c
            ) => s.length ? f() && func(s.substr(1), r) : r
          
            return func(str)
          }
          
          
          [
            "",
            " ",
            "   ",
            "hello world I am fine"
          ].forEach(s =>
            console.log(`[${s}] --> ${stringToUrl(s)}`)
          );

          【讨论】:

            猜你喜欢
            • 2017-12-29
            • 2020-12-20
            • 1970-01-01
            • 2022-11-19
            • 2012-02-07
            • 1970-01-01
            • 2010-11-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多