Script de Python para demostrar el último teorema de Fermat, con la opción de reiniciar -- python campo con beginner campo con python-3.x camp codereview Relacionados El problema

Python script to demonstrate Fermat's Last Theorem, with option to restart


3
vote

problema

Español

Soy un codificador para principiantes que aprende Python. Este es un simple ejercicio del libro ThinkPython. Me gustaría saber si esta circular se hace referencia para reiniciar el programa la mejor manera de hacerlo. Además, si tiene otros comentarios sobre cómo mejorar el código, no dude en sugerir.

  CheckIn1  
Original en ingles

I am a beginner coder learning Python. This is a simple exercise from the thinkpython book. I would like to know if this circular referencing to restart the program the best way to do it. Also if you have other comments as to how to improve the code, please feel free to suggest.

def program_restart():     print("Would you like to try again? ")     prompt = input("type 'Y' to continue and 'N' to exit:\n")     if prompt =="Y" or prompt == "y":         user_input()     return  def check_fermat(a,b,c,n):     if a**n+b**n == c**n:         print("Holy Smokes, Fermat was wrong!")         print("---------------------------")     else:         print("No, that does not work!")         print("---------------------------")     program_restart()  def user_input():     print("Let's see if Fermet was right. He claims that a^n+b^n=c^n cannot be True!")     while True:         try:             a = int(input('Give a positive number bigger than 2 for "a":\n'))         except ValueError:             print ("Not a string, a number please.")             continue          if a > 2:             a = int(a)             break      while True:         try:             b = int(input('Give a positive number bigger than 2 for "b":\n'))         except ValueError:             print ("Not a string, a number please.")             continue          if b > 2:             b = int(b)             break      while True:         try:             c = int(input('Give a positive number bigger than 2 for "c":\n'))         except ValueError:             print ("Not a string, a number please.")             continue          if c > 2:             c = int(c)             break      while True:         try:             n = int(input('Give a positive number for the exponent "n":\n'))         except ValueError:             print ("Not a string, a number please.")             continue          if n > 2:             n = int(n)             break      check_fermat(a,b,c,n)  user_input() 
        

Lista de respuestas

3
 
vote

Matemáticas

El último teorema de Fermat estados:

No tres enteros positivos A , B , y C Satisfacer la ecuación A N + b n = C n para cualquier valor entero de n mayor que 2.

Eso no es lo que hace su código. ¿Por qué usted requiere que DictReader1 , DictReader2 y 99887766555443313 es mayor que 2, cuando solo necesitan ser mayores que 0? ¿Por qué su solicitud de DictReader4 solo dice Dé un número positivo para el exponente "N" cuando debe decir dar un entero mayor que 2 para el exponente "n "?

y quien es "fermete"?

Control de flujo

Las llamadas de función no deben usarse como GOTOS. Las funciones deben aceptar parámetros y devolver un resultado. Sus llamadas a DictReader5 y DictReader6 , por otro lado, espere que la ejecución nunca regrese a la persona que llama. Para ver el problema con eso, digamos "sí" unas cuantas veces para reintentar el cálculo, luego presione CTRL C para abortar. Verá el seguimiento de la pila, lo que indica que la pila cada vez más profunda está realizando un seguimiento de todas las llamadas, en anticipación para la oportunidad de devolver el control a la persona que llama. Dado que el control nunca regresa, la pila crece más profundamente y eventualmente se desbordará.

Solución sugerida

  DictReader7  

Una demostración más interesante

Sería una demostración más satisfactoria si la computadora solicitó al usuario DictReader8 , 99887766555443319 , y 9988776655544332020 , luego resuelve para player1 , que muestra que player2 no es un entero.

 

Mathematics

Fermat's Last Theorem states:

No three positive integers a, b, and c satisfy the equation an + bn = cn for any integer value of n greater than 2.

That's not what your code does. Why are you requiring that a, b, and c be greater than 2, when they only need to be greater than 0? Why does your prompt for n only say Give a positive number for the exponent "n" when it should say Give an integer greater than 2 for the exponent "n"?

And who is "Fermet"?

Flow control

Function calls should not be used as gotos. Functions should accept parameters and return a result. Your calls to user_input() and program_restart(), on the other hand, expect the execution to never return to the caller. To see the problem with that, say "yes" a few times to retry the calculation, then hit CtrlC to abort. You'll see the stack trace, which indicates that the ever-deepening stack is keeping track of all the calls, in anticipation for the opportunity to return control to the caller. Since control never returns, the stack grows deeper and would eventually overflow.

Suggested solution

def prompt_yesno(prompt):     return input(prompt) in 'Yy'  def prompt_int(prompt, min=None):     while True:         try:             ans = int(input(prompt))             if min is None or min <= ans:                 return ans         except ValueError:             print("Input must be an integer.")  def is_fermat_counterexample(a, b, c, n):     return n > 2 and a**n + b**n == c**n  def fermat_demo():     print("Let's see if Fermat was right.")     print("He claims that a^n + b^n = c^n cannot be true for any n > 2.")     a = prompt_int('Give a positive integer for "a": ', 1)     b = prompt_int('Give a positive integer for "b": ', 1)     c = prompt_int('Give a positive integer for "c": ', 1)     n = prompt_int('Give an integer bigger than 2 for exponent "n": ', 3)     print("Holy smokes, Fermat was wrong!"           if is_fermat_counterexample(a, b, c, n) else           "No, that does not work!")  while True:     fermat_demo()     if not prompt_yesno("Would you like to try again?\n"                         "Type 'Y' to continue and 'N' to exit: "):         break 

A more interesting demonstration

It would be a more satisfying demonstration if the computer asked the user for a, b, and n, then solved for c, showing that c is not an integer.

 
 
2
 
vote

algunos Detalles de PEP-8 :

1.- Según PEP-8 entre Cada función tiene que tener dos líneas en blanco.

2.- Espacio entre los parámetros (es decir, def check_fermat(a, b, c, n): en lugar de def check_fermat(a,b,c,n): . fuente

3.- Fin del archivo debe ser una nueva línea vacía.

4.- Hay un espacio adicional entre print y ("Not a string, a number please.")3

relacionado con el código;

5.- En lugar de verificar 'y' o 'y' Puede aplicar la entrada en minúscula a usuario ( 9988777665544334 )

6.- a = int(a) es redundante, lo mismo para b , c7 y 9988776655544338 .

7.- De acuerdo con su código n debe ser superior a 2, ¿es correcto?

8.- Está repitiendo el código de entrada del usuario, debe crear una nueva función para eso.

9.- Compruebe que Fermat debe hacerlo, por lo que, def check_fermat(a,b,c,n):0 debe manejarse en otro lugar.

10.- que def check_fermat(a,b,c,n):1 ON def check_fermat(a,b,c,n):2 es innecesario.

11.- Si está dentro def check_fermat(a,b,c,n):3 Tiene otra llamada a def check_fermat(a,b,c,n):4 y dentro de este segundo def check_fermat(a,b,c,n):5 Otra llamada a def check_fermat(a,b,c,n):6 y así sucesivamente. (Está cayendo en una recursión. La recursión per se no es mala, pero en este caso es porque está tratando de repetir el programa, no para resolver un mejor enfoque), un mejor enfoque es control que con un bucle.

12.- Agregar def check_fermat(a,b,c,n):7 < / p>

  def check_fermat(a,b,c,n):8  

 

Some PEP-8 details:

1.- According PEP-8 between each function you have to have two blank lines.

2.- Space between parameters (ie def check_fermat(a, b, c, n): instead of def check_fermat(a,b,c,n):. Source

3.- End of file it should be an new empty line.

4.- There is an extra space between print and ("Not a string, a number please.")

Related with the code;

5.- Instead of checking for 'y' or 'Y' you can apply lowercase to user input ( if str.lower(prompt) == "y":)

6.- a = int(a) is redundant, same for b, c and n.

7.- According your code n it should be higher than 2, is this correct?

8.- You are repeating the user input code, you should create a new function for that.

9.- Check fermat should just do that, so, program_restart should be handled in another place.

10.- That return on program_restart is unnecessary.

11.- If inside program_restart you have another call to user_input and inside this second user_input another call to program_restart and so on.. (You are falling into a recursion. Recursion per se is not bad, but in this case it is because you are trying to just repeat the program, no to solve some problema trough recursion), a better approach is control that with a loop.

12.- Add if __name__ == '__main__':

def program_restart():     print("Would you like to try again? ")     prompt = input("type 'Y' to continue or any other character to exit:\n")     return str.lower(prompt) == "y"   def check_fermat(a, b, c, n):     if a ** n + b ** n == c ** n:         print("Holy Smokes, Fermat was wrong!")     else:         print("No, that does not work!")      print("---------------------------")   def ask_number(text, bigger_than=0):     number = bigger_than - 1     while number <= bigger_than:         try:             number = int(input(text))         except ValueError:             print("Please write a valid number.")      return number   def user_input():     run_program = True      while run_program:         print("Let's see if Fermat was right. He claims that a^n+b^n=c^n cannot be True!")         a = ask_number(text='Give a positive number bigger than 2 for "a":\n', bigger_than=2)         b = ask_number(text='Give a positive number bigger than 2 for "b":\n', bigger_than=2)         c = ask_number(text='Give a positive number bigger than 2 for "c":\n', bigger_than=2)         n = ask_number(text='Give a positive number for the exponent "n":\n')         check_fermat(a, b, c, n)          run_program = program_restart()   if __name__ == '__main__':     user_input() 
 
 
1
 
vote

El problema con Circular Referencia para reiniciar el programa es que usted Llame STACK será más grande y más grande y obtendrá una excepción después de 340 ~ intentos.

Debe usar un bucle en lugar :

  def check_fermat(a,b,c,n):9  
 

the problem with circular referencing to restart the program is that you call stack will get bigger and bigger and you'll get an exception after 340~ tries.

you should use a loop instead:

while 1:     user_input() 
 
 

Relacionados problema

2  Implementación de árboles de búsqueda de ternarios en Python 3  ( Ternary search tree implementation in python 3 ) 
He implementado un árbol de búsqueda ternario. Funciona bien. Pero si crees que algo necesita mejorarse, dígalo. Este código fue probado en Python 3.7.4. c...

0  Producto cartesiano de dos tuplas - Python  ( Cartesian product of two tuples python ) 
Estoy resolviendo el ejercicio 4 de Discusión 3 de CS 61A (2012) de Berkley (2012) (consulte la página 4): Rellene la definición de cartesian_product . ...

5  Excel a JSON Parser con http descargar  ( Excel to json parser with http download ) 
He estado trabajando en un proyecto ( enlace ) a Descargue una hoja de cálculo de Ransomware y propiedades conocidas y conviértase en JSON para que pueda cons...

5  Acelera a OpenGL 2D en Python3  ( Accelerate opengl 2d on python3 ) 
Estoy usando OpenGL para dibujar alrededor de 20 círculos. Cada círculo tiene 2 líneas, ~ 10 segmentos, y todos ellos tienen diferentes colores y longitudes. ...

7  Juego de Blackjack hecho en Python 3  ( Blackjack game made in python 3 ) 
Este es un juego de blackjack simple, terminé de hacer con Python. Espero que te guste y estoy abierto a cualquier sugerencia o crítica que me darías. NSUS...

2  Algoritmo de libros que se ocupa de sumas de dígitos cuadrados  ( Books algorithm dealing with square digit sums ) 
un pequeño contexto: libro tiene 411 páginas Lea un número aleatorio de páginas en el primer día que es desconocido Número de páginas para leer e...

4  Calculadora binaria de Python  ( Python binary calculator ) 
Mi tarea fue construir una calculadora en la adición binaria de soporte de Python, etc. Para comenzar Definir un par de excepciones personalizadas: paper...

5  Orden de número más grande en cadena  ( Largest number order in string ) 
Dada una cadena, suponiendo que la cadena sea solo números, reorganice la cadena a la que sea el mayor número posible. a continuación es mi solución al pr...

3  Juego de Hangman escrito en Python 3.5  ( Hangman game written in python 3 5 ) 
Esto recopila las conjeturas del usuario para la palabra. El usuario tiene 8 conjeturas, una conjetura correcta y una suposición repetida no afecta al conteo ...

5  Suma de todos los dígitos en una cadena  ( Sum of all digits in a string ) 
Dada una cadena, devuelva la suma de todos los números en la cadena, 0 si no hay ninguno. A continuación es mi solución para el problema anterior. Siento ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos