很难理解为什么这个回文方法有效

时间:2015-03-21 13:32:31

标签: ruby

以下是可正常工作的回文方法:

def palindrome?(string)
  i = 0
  while i < string.length
    if string[i] != string[(string.length - 1) - i]
      return false
    end

    i += 1
  end

  return true
end

# These are tests to check that your code is working. After writing
# your solution, they should all print true.

puts('palindrome?("abc") == false: ' + (palindrome?('abc') == false).to_s)
puts('palindrome?("abcba") == true: ' + (palindrome?('abcba') == true).to_s)
puts('palindrome?("z") == true: ' + (palindrome?('z') == true).to_s)
puts('palindrome?("2220222") == true: ' + (palindrome?('2220222') == true).to_s)
puts('palindrome?("2220922") == false: ' + (palindrome?('2220922') == false).to_s)

以下是我无法理解的事情:

a)如果while循环之外的表达式false在循环结束后总是返回return true,则该方法如何返回true,覆盖之前的任何return false语句?

b)如果是假的回文,例如2220922,为什么while循环返回false,即使最后一次迭代(string [5]!= string [0])比较2到2,这应该评估真的吗?

1 个答案:

答案 0 :(得分:2)

这两个问题都是真的。 返回false将退出该方法并返回false,它永远不会返回true。

只有当两个角色不匹配时才会发生这种情况

所以2220922 它比较

2     2 in the first pass
 2   2  in the next
  2 9    in the 3rd and returns false.

第3遍i = 2,以便7 - 1 - 2 = 4,字符串中的第4个字符为9

使行为更清晰的另一种选择是

def palindrome?(string)
  result = true
  i = 0
  while (i < string.length) && result
    result = string[i] != string[(string.length - 1) - i]
    i += 1
  end

  return result
end

说你知道string == string.reverse会有效吗?