【问题标题】:Recursion issue with my approach or concept or the issue?我的方法或概念或问题的递归问题?
【发布时间】:2021-11-10 02:24:09
【问题描述】:

所以我正在做一个算法挑战,给我一个单词数组,我必须将单词的第一个字母大写并返回带有新单词的 arr。它必须通过递归来完成。我相信我的方法是错误的,但是如果从概念上讲,请告诉我以及我应该如何考虑这一点。如果有人可以帮助描述我应该如何在概念上和代码中处理这个问题,那将非常有帮助。

从概念上描述我的想法:

 1st call: ['Car'] + capitalizeFirst([taco, banana]);
 2nd call: ['Taco'] + capitalizeFirst([banana]);
 3rd call: ['Banana'] + capitalizeFirst(['']);

所以当它往回走时它会返回

['Banana'] + ['""']
['Taco'] + ['Banana']
['Car'] + ['Taco','Banana']
returns ['Car','Taco','Banana']

但我得到的是“CarTacoBanana”。
这是我采取的方法。

function capitalizeFirst (arr) {

  if (!arr.length) return '';
  arr[0] = arr[0].charAt(0).toUpperCase() + arr[0].slice(1);
  return [ arr[0] + capitalizeFirst(arr.slice(1)) ];

}

capitalizeFirst(['car','taco','banana']); // ['Car','Taco','Banana']

(编辑)我能够解决我的方法是错误的!这是我的解决方案

  let newArr = [];
  if (!arr.length) {
    return newArr;
  }
  else {
       arr[0] = arr[0].charAt(0).toUpperCase() + arr[0].slice(1);
       newArr.push(arr[0]);
    }
  

  console.log(newArr, 'test');

  return newArr.concat(capitalizeFirst(arr.slice(1)))
  // return newArr;

【问题讨论】:

    标签: javascript arrays string algorithm recursion


    【解决方案1】:

    function capitalizeFirst(arr) {
      // define the recursion terminal condition
      if (!arr.length) return [];
      // utility to capitalize first letter
      const capWord = s => s.charAt(0).toUpperCase() + s.slice(1);
      
     
      // a well-written recursive function makes clear what each iteration does, here:
      // capitalize the first word, then recurse on the remaining words...
      const first = arr[0], rest = arr.slice(1);
      return [ capWord(first), ...capitalizeFirst(rest) ];
    }
    
    let arr = [ 'every', 'good', 'boy', 'does', 'fine' ];
    let result = capitalizeFirst(arr);
    console.log(result);

    我认为您有一个粗略的想法,但您从一般算法设计以及实现角度错过了一些东西。最好统一返回一些东西(比如这里的[]),然后将它们组合起来形成答案。所以我稍微改变了基本情况和归纳情况,然后你就可以得到格式正确的答案了。

    这是粗略的代码,从现在开始,您可以自行检查基本的极端情况测试。

    【讨论】:

    • 改变输入参数的第一个元素然后返回一个新数组是一种奇怪的选择。我认为你应该决定是否破坏性地这样做。
    • @danh 我完全忽略了这些东西。你说的很有道理。
    • @danh 我认为这可以解决问题 - 如果我遗漏了什么,请随时告诉我。
    • 我接受了你的基本想法,把它做成了一个 sn-p 并添加了一些有启发性的 cmets。 (希望我没有太冒昧)。
    【解决方案2】:

    您的思考过程很接近,但我建议将 [""] 更改为简单的 [] - 我看不到空字符串的来源,但不需要 -

    const capitalize = ([ first, ...more ]) =>
      first.toUpperCase() + more.join("")
    
    const capitalizeAll = ([ first, ...more ]) =>
      first == null
        ? []
        : [capitalize(first), ...capitalizeAll(more)]
    
    console.log(capitalizeAll(["car", "taco", "banana"]))
    
    // ["Car", "Taco", "Banana"]

    注意,capitalizeAll 只不过是Array.prototype.map 加上对capitalize 的硬编码调用-

    const capitalize = ([ first, ...more ]) =>
      first.toUpperCase() + more.join("")
    
    console.log(["car", "taco", "banana"].map(capitalize))
    
    // ["Car", "Taco", "Banana"]

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 2010-10-10
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2011-02-11
      相关资源
      最近更新 更多