尝试使用javascript创建等值线图(但有些东西我不明白)

问题描述 投票:0回答:1

所以我对编码相当陌生,我正在尝试使用 javascript 制作等值线图(不使用任何内置方法,因为我仍在学习基础知识),但我很难掌握这种编程语言背后的逻辑。这是我最初使用的代码...

const isogram = word => {

  for(let i= 0; i< word.length; i++){ 
    for(let j = i+1; j< word.length; j++){
      if(word[i] === word[j]){
        console.log(`the letter '${word[j]}' is repeated`)
      } 
    }
  }
}

input: console.log(isogram("happy"));

//output: the letter 'p' is repeated

正如你所看到的,它工作得很好,UNITL,我添加了一个“else-statement”,它变得疯狂:

const isogram = word => {

  for(let i= 0; i< word.length; i++){ 
    for(let j = i+1; j< word.length; j++){
      if(word[i] === word[j]){
        console.log(`the letter '${word[j]}' is repeated`)
      } else {
        console.log(`'${word}' is an isogram`)
      }
    }
  }
}

input: console.log(isogram("happy"));
//output: 'happy' is an isogram
'happy' is an isogram
'happy' is an isogram
'happy' is an isogram
'happy' is an isogram
'happy' is an isogram
'happy' is an isogram
the letter 'p' is repeated
'happy' is an isogram
'happy' is an isogram

input: console.log(isogram("cake"))
//output: 'cake' is an isogram
'cake' is an isogram
'cake' is an isogram
'cake' is an isogram
'cake' is an isogram
'cake' is an isogram

这个结果有两个问题:

  1. 当我输入一个不是等值线的单词(在本例中为“快乐”)时,它会打印出 else 语句,该语句表明该单词确实是等值线(即使快乐不是等值线)。然而,它还指出了单词中重复的字母,在本例中是“happy”中的字母“p”。

  2. 当我输入一个像“蛋糕”这样的等值图的单词时,它说它是一个等值图(这很好),但它说了多次而不是一次......

我认为这与嵌套的“for循环”有关,所以也许“if”和“else”控制台语句正在打印单词中的each字符而不是整个单词?例如,对于“快乐”,我假设这就是它正在做的事情:

h 'happy' 是一个等值图 //第一个循环 h 'happy' 是一个等值图 //第二个循环 a 'happy' 是一个等值图 //第一个循环 'happy' 是一个等值图 //第二个循环 p 'happy' 是一个等值线 //第一个循环 p 'happy' 是一个等值图 //第二个循环 p 'happy' 是一个等值线 //第一个循环 p 重复字母“p” //第二次循环 y 'happy' 是一个等值图 //第一个循环 y 'happy' 是一个等值线 //第二个循环

我还尝试通过用 return 关键字替换 else 语句来修复它,但我遇到了另一个问题;这次,当我输入等值图单词时,它会打印两个语句,而使用非等值图单词则效果很好。

const isogram = word => {

  for(let i= 0; i< word.length; i++){ 
    for(let j = i+1; j< word.length; j++){
      if(word[i] === word[j]){
        console.log(`the letter '${word[j]}' is repeated`)
      } 
    } 
  }
  return `'${word}' is an isogram`
}

input: console.log(isogram("happy"));
//output: the letter 'p' is repeated
'happy' is an isogram

input: console.log(isogram("cake"))
//output: 'cake' is an isogram

总的来说,我很困惑:为什么只有在我添加“else”语句后才开始发生这种情况?这背后的逻辑是什么?我该如何修复它以便控制台语句只打印一次?另外我如何在这里有效地使用 return 关键字?

我只是希望控制台在不是和等值线图时打印“字母''重复” 如果单词是等值线图,则打印“'单词'是等值线图”。

javascript for-loop if-statement conditional-statements return
1个回答
0
投票

首先,我想澄清一下“等值图”的含义。等值线图是一个单词,其中每个字母出现相同的次数,似乎您正在专门检查“一阶等值线图”,其中每个字母只出现一次。

这样,您的代码的最后一个版本就非常接近了。问题在于,当它发现重复的字母时,它只是

console.log()
而不是返回它。这会导致它只是登录到控制台,继续循环,然后
return "'${word}' is an isogram"
无论如何(我用双引号替换了反引号,因为 StackOverflow 似乎不允许嵌套反引号?)。如果您希望它在发现重复的字母后立即终止,您可以简单地在
return "the letter '${word[j]}' is repeated"
之后按
return
console.log()

if(word[i] === word[j]){
    return `the letter '${word[j]}' is repeated`;
} 
if(word[i] === word[j]){
    console.log(`the letter '${word[j]}' is repeated`);
    return;
} 

至于

else
版本,它不仅仅是“在我添加‘else’语句后就开始发生”。在 if-else 语句中,如果
if
块运行,则
else
块不会运行。如果
if
块不运行,则
else
块运行。对于“happy”,
if
块仅在遇到两个“p”时运行一次,因为
word[i] === word[j]
为真,所以自然地,每个其他循环迭代都会运行
else
块,因为没有其他字母组合匹配。

i = 0: | h === a: 假 | h === p: 假 | h === p: 假 | h === y:假|

i = 1: | a === p: false | a === p: false | a === y:假|

i = 2: | p === p: true | p === y:假|

i = 3: | p === y:假|

i = 4 |(这里没有任何内容,因为 j 从 5 开始)|

© www.soinside.com 2019 - 2024. All rights reserved.