【问题标题】:Counting Palindromes using recursion使用递归计算回文数
【发布时间】:2020-11-12 01:30:24
【问题描述】:

我目前有一个代码,它计算给定字符串中的回文数,它工作正常,直到我用“appal”测试它,当它应该返回 2(appa 和 pp)时,函数返回 0 如果有人我真的很感激可以编辑我当前的代码以满足该要求,谢谢! 这是我的代码:

function countPalindromes(string, count) {
  if (string.length <= 1) {
    return count;
  }

  let [ firstLetter ] = string;
  let lastLetter = string[string.length - 1];

  if (firstLetter === lastLetter) {
    let stringWithoutFirstAndLastLetters = string.substring(1, string.length - 1);
    return countPalindromes(stringWithoutFirstAndLastLetters, count + 1);
  } else {
    return 0;
  }
}

console.log(countPalindromes("kayak", 0));
console.log(countPalindromes("aya", 0));
console.log(countPalindromes("appal", 0));

【问题讨论】:

  • 我认为你的问题是你只会检查 appalppa 是否是回文。您需要找到一些方法来检查没有仅第一个字母的字符串和仅没有最后一个字母的字符串。
  • @M-Chen-3 你觉得你能帮我吗?
  • 应该xyzappa 也返回2,因为appapp 是回文?这到底应该如何工作?
  • 是的,也应该返回 2,我的作业要求我“给定一个字符串,计算该字符串中存在的回文数(不包括单个字母),同时使用递归”@Sylwester跨度>
  • @Sylwester 非常感谢您的帮助!!

标签: javascript function recursion palindrome


【解决方案1】:

我认为这个函数可以解决问题。很高兴重构并稍后解释。我宁愿写一个新函数,因为我不认为你的代码接近执行任务。

function returnNumberOfPalindromes(word) {
    function isPalindrome(chunk) { 
        return [...chunk].reverse().join('') === chunk;
    }
    let tally = 0;
  
    for (let index1 = 0; index1 <= word.length; index1++) {
      for (index2 = index1 + 2; index2 <= word.length; index2++) { 
        let chunk = word.slice(index1, index2); 
        if (isPalindrome(chunk)) {
            tally += 1;
        };
      }
    }
    console.log(tally);
}

returnNumberOfPalindromes("kayak");
returnNumberOfPalindromes("aya");
returnNumberOfPalindromes("appal");
returnNumberOfPalindromes("addadaadd");

【讨论】:

  • 您知道如何通过迭代方法编写相同的代码吗? @tonitone120
  • @28spaceaddict 我理解迭代这个词的意思是“重复”——例如,for loop。 (根据这个定义,我会说我的答案是一种迭代方法)。您能举例说明迭代方法的含义吗?我现在得走了,但我稍后会回来
  • 是的,这是一种迭代方法,所以我需要具有迭代方法的相同代码以及使用递归@tonitone120
  • 你认为你会在 20 分钟内回来吗,因为我必须在 40 分钟内提交它?
【解决方案2】:

function isPalindrome(str) {
  return str == str.split("").reverse().join("");
}
//iterative only solution
function countPalindromes(s) {
  let count = 0;
  for (let i = 0; i < s.length - 1; i++) {
    const sub = s.slice(i);

    for (let j = 2; j < sub.length + 1; j++) {
      if (isPalindrome(sub.slice(0, j))) {
        count++
      }
    }
  }
  return count;
}

console.log(countPalindromes("kayak"));
console.log(countPalindromes("aya"));
console.log(countPalindromes("appal"));

您将第一个字母与最后一个字母进行比较,并将返回零,因为这对于 appal 来说是假的,而对于其他 2 个测试用例来说是真的。

【讨论】:

  • 你能帮我解决这个问题吗? @candaceahrends
  • 这里有一个类似的问题:stackoverflow.com/questions/64596115/…
  • 那个问题谈到了实现一个迭代函数,它有同样的问题,appal 返回 0 而不是 2 @candaceahrends
  • 我的作业要求我“给定一个字符串,计算该字符串中存在的回文数(不包括单个字母),同时使用递归”@CanadaceAhrends
  • 请帮帮我,我将不胜感激
【解决方案3】:
  1. 因此,基本上,如果您通过扫描字符串并将currentcurrent+1current+2在迭代循环中比较并将匹配项存储为具有开始结束结束的对象来找到类似ppapa的回文索引。

  2. 您启动一个计数,它是数组的长度。

  3. 如果较大的 1 是回文,则通过过滤更新对象的元素来更新数组

  4. 如果数组长度为零,则返回计数

  5. 将数组长度添加到计数中并从 3 开始重复。

【讨论】:

  • @28spaceaddict 因为这肯定是作业,我不会。您应该编写自己的代码。我的回答只是描述了我会如何做到这一点。如果您阅读本文并在纸上手动完成,您是否发现它有任何弱点?
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
相关资源
最近更新 更多