Calcul Mystere Problema

Hola! Soy nuevo en el foro.
Me han dejado un TP en la escuela. He tenido que hacer un programa que sube a la potencia x un número, un programa que extrae valores componentes de un color cifrado hexadecimal y otras cosillas. Sin embargo me he trabado en este asuntillo. Les dejo el programa.

import java.util.*;

public class CalculMystere {
  public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    int n;
   
    System.out.print("Entrez le nombre auquel appliquer le calcul mystère : ");
    while(!sc.hasNextInt()) sc.next();
    n =  sc.nextInt();
   
    System.out.println("Le calcul mystere appliqué à " + n + " donne : " + itf(n - (1 - n%2)));
  }
 
  public static int itf(int n) {
    if(n != 1) return n * itf(n - 2);
    else return 1;
  }  
}

El chiste es detallar lo que representa el valor enviado por el programa en función del número n colocado.
Aquí lo que tengo:

itf(n - (1 - n%2)

una simple fórmula aplicada al número n sacando su modulo.
Pero, al llamar a una variable estática integral itf, el mundo se pone de cabeza.

public static int itf(int n) {
    if(n != 1) return n * itf(n - 2);
    else return 1;
  }

Y es aquí donde ya no entiendo nada.

Muchas gracias de antemano. Apenas estoy aprendiendo en este mundillo y no logro entender este programa!
Saludos!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de paranoid_android

Práctica de refactoring y definición.

El estilo de redacción y codificación resulta difícil de entender y por lo mismo de corregir. Espero que no te enojes a cualquiera le pasa.
Yo tampoco entendí que tratas de hacer y menos que debe hacer el programa según la especificación técnica.
Estaría genial que Oscar Rys viera este código es un claro ejemplo para la práctica de refactoring.

Imagen de bferro

No hay nada que refactorizar

El problema es un ejercicio para una sucesión. itf NO es una variable integral, ES una función estática que va a calcular el producto de números impares.

Dado un número positivo de entrada encontrará el número inmediatamente anterior impar si el número de entrada es par, o mantendrá el mismo número en caso que sea impar.
La función itf realizará el cálculo n * (n-2) * (n-4) * (n-6) *.... 3 * 1y devolverá ese resultado.

Dado un número negativo de entrada, encontrará en número inmediatamente anterior impar si el número de entrada es impar, o el número inmediatamente posterior impar si el número de entrada es par.
La función itf realizará el mismo cálculo pero ahora " no para" pues el nuevo número generado para cada ejecución de la función recursiva será más negativo y nunca se llegará al caso base de esa recursividad.

Imagen de paranoid_android

Independiente al problema de la variable estática

Insisto estamos chupando tranquilos jajaja.

Me parece bien Bferro la explicación.

Bueno dylanpk el problema de la variable estática.
Mi sugerencia: Lleva la lógica de tu método public static void main a métodos de clase, asi ya no necesitarias el método static del método itf. Inténtalo abajo si quieres.

Esa clase puede vivir sin refactoring como todas las demás que funcionan, hasta que alguien caiga en condiciones no previstas o pida un cambio.
Yo siento que cuando alguien vea itf sin tener contexto no va saber que es, sería bueno agregar comentarios al código.

El otro problema en funciones matemáticas.
¿Cuándo va a fallar?
¿Cómo sabes que obtiene los resultados correctos?
¿Qué restricciones tiene el tipo de dato usado?

Imagen de bferro

Si no entiendes lo que hace itf you are in trouble.

Si no entiendes lo que hace itf, entonces es bueno un repasón de funciones recursivas y también saber cómo se calcula el factorial o el semifactorial (también llamado doble factorial) de un número.

to iterate is human, to recurse is divine.

Imagen de ingscjoshua

wow

Q buena explicacion pues igual deberias publicar un post de una explicacion de recursividad!!!! ami me hace falta aprender mucho como implementarlo en java en donde si y en donde no es viable gracias y que buen aporte aunq solo entendi la mitad de lo que dijiste!! :S

Imagen de paranoid_android

Aclaro

Estoy de acuerdo bferro.
Más no caería nada mal que dylanpk tuviera uno o dos ejercicios resueltos para que pruebe el resultado esperado.

Y... a pesar de todo en producción se dé cuenta de que hay casos no considerados. jajaja.