2016-12-22 2 views
2

私はPythonにはかなり新しく、Project Eulerの課題を試しています。私は現在、ネストされたforループを正しく動作させるのに問題があります。私のコードは次のようになります。Python-期待どおりに機能しないループのためにネストされました

def palindrome(): 
    for i in range(999,317,-1): 
     for a in range(999,317,-1): 
      s = str(i*a) 
      if s[0] == s[5] and s[1] == s[4] and s[2] == s[3]: 
       return(s) 
print(palindrome()) 

プログラムのポイントは2つの3桁の数字の積で可能な最大回文を見つけることです。私はこのプログラムを実行するとき、私は一貫して答え580085を得る。それは回文であるが、間違った答えであることが分かっている。

コンクリート質問:私は不適切ないくつかの方法でループのネスト/

  1. を使用していますか?
  2. 2つのループを使用せずに回文を検索する方法はありますか?
+1

あなたの2番目のforループは 'for a range(i、317、-1):'に変更することができます。返す代わりに、すべての回文をリストに追加し、ループの両方の後に最大を得ることができます – depperm

+3

@depperm 1つの最大の回文を保存し、大きい場合は新しいものに変わります。 –

+0

def isPalindrome(number): str(number)== '' .join(反転(str(number)))else False – Shijo

答えて

3

これを試してみてください:

def palindrome(): 
    return max(i * j for i in range(999, 317, -1) 
         for j in range(i, 317, -1) 
         if str(i*j) == str(i*j)[::-1] 
       ) 

以上読みやすい方法を:

def palindrome(): 
    largest = 0 
    for i in range(999, 317, -1): 
     for j in range(i, 317, -1): 
      if str(i*j) == str(i*j)[::-1] and i*j > largest: 
       largest = i*j 
    return largest 
+0

ありがとう!申し訳ありませんが、まだupvoteできません – Luke

2

あなたはかなり近いです。あなたのコードは見つかった最初のパリンドロームを返すので、すべての回文を見つけたいだけで最大のものを返すだけです。それは999 * 400で終了することがありますたとえば、あなたのコードは、最初に見つかった回文で終了する瞬間

def palindrome(): 
    largest = 0 
    for i in range(999,317,-1): 
     for a in range(999,317,-1): 
      s = str(i*a) 
      if s[0] == s[5] and s[1] == s[4] and s[2] == s[3]: 
       if int(s) > largest: 
        largest = int(s) # <-- don't return, just set s aside and keep checking 
    return largest 
+0

2回目のループで999をiに変更すると、同じ製品を2回チェックしないと少し速くなります – depperm

+0

ありがとうございます!申し訳ありませんが私はまだupvoteできません。私は間違いがforループの中にリターンを置いていたと言って正しいでしょうか? – Luke

+0

@LukeWellerはい、基準の半分が満たされたときに戻ってくるのはよくある間違いです。関数の先頭に戻って変数を代入して代入すると、すべてのループが完了するまで戻らないことを覚えていることがあります。 – Will

1

、:のようなものを試してみてください。しかし、より大きな回文は900 * 800で見つかるかもしれません(これらの値はありませんが、あなたはそのアイデアを得ます)。

def palindrome(x, y): 
    lis = [] # Contains the palindromes 
    for i in range(x,317,-1): 
     for a in range(y,317,-1): 
      s = str(i*a) 
      if s[0] == s[5] and s[1] == s[4] and s[2] == s[3]: 
       lis.append(i*a) 

    # Finding largest palindrome 
    largest = 0 
    for i in range(0, len(lis)): 
     if lis[i] > largest: 
      largest = lis[i] 
    return largest 

print(palindrome(999, 999)) 

は、これは値を返します:906609 それだけではなく、あなたはあなたにそれを見つけることができるすべての回文のリストを与えるために、このコードを変更することができ

あなたがこれを行うことができ、これを修正するには。

1

これはあなたが見つけたの最初のの回文です。それはあなたが見つける最大のものではありません。ループは文書化されているように動作します。最初はi = 999で、999 * 999から999 * 317までの作業を行います。 あなたは外側のループに戻り、i = 998に設定し、a = 999からやり直します。最初のユニークな製品998 * 998は、以前の2回の反復999 * 317よりもかなり大きいことに注意してください。

これを解決する方法の1つは、これまでに見つかった最大の回文を保存し、すべてを通過したときにのみ結果を印刷することです...またはk * k <が早く終了するときに停止します。

もう1つの方法は、最大の製品をダウンして作業するようにループパラメータを変更することです。

関連する問題