Recursivo contiene método -- java campo con beginner campo con recursion camp codereview Relacionados El problema

Recursive Contains Method


3
vote

problema

Español

El método a continuación verifica recursivamente si una cadena contiene otra cadena. Ejemplo: contains(hello, lo, 0) debe devolver true , mientras que 9988777665544339 debe devolver private int biggestBinaryGap(int n) { while (endsWithZero(n)) n >>= 1; return biggestBinaryGapRec(n >> 1); } private int biggestBinaryGapRec(int n) { if (n == 0) return 0; int gap = 0; for (; endsWithZero(n); n >>= 1, gap++); return Math.max(gap, biggestBinaryGapRec(n >> 1)); } private boolean endsWithZero(int n) { return n > 0 && (n & 1) == 0; } 0 . El método en sí funciona, pero me preguntaba cómo podría hacerse más eficiente / generalmente mejor.

MÉTODO:

  private int biggestBinaryGap(int n) {     while (endsWithZero(n))         n >>= 1;     return biggestBinaryGapRec(n >> 1); }  private int biggestBinaryGapRec(int n) {     if (n == 0)         return 0;      int gap = 0;     for (; endsWithZero(n); n >>= 1, gap++);     return Math.max(gap, biggestBinaryGapRec(n >> 1));  }  private boolean endsWithZero(int n) {     return n > 0 && (n & 1) == 0; } 1  
Original en ingles

The method below recursively checks if a string contains another string. Example: contains(hello, lo, 0) should return true, while contains(hello, eh, 0) should return false. The method itself works, but I was wondering how it could be made more efficient/generally better.

Method:

public static boolean contains(String word1, String word2, int index) {        if((word1 == null) || (word2 == null)){         return false;      }      if(index + (word2.length() - 1) >= word1.length()){         return false;      }       int count = 0, j = 0;      for(int i = index; i < (word2.length() + index); i++){          if(word1.charAt(i) == word2.charAt(j)){             if((i != 0) && (j != 0)){                 if(word1.charAt(i - 1) == word2.charAt(j - 1)){                     count++;                 }               } else {                 count++;             }         }         j++;     }       if(count == word2.length()){         return true;      }       return contains(word1, word2, index + 1); } 
        

Lista de respuestas

2
 
vote

Para el "estilo" recursivo adecuado, no debe usar un bucle para dentro de la función. Cada pase a través de la función debe realizar una prueba y luego configurar el siguiente pase. Esto también le libera de necesidad de rastrear el índice como un argumento.

Considere que:

  contains("hello", "lo") ==  contains("ello", "lo") ==  contains("llo", "lo") ==  contains("lo", "lo")   
 

For proper recursive 'style', you shouldn't use a for-loop inside the function. Each pass through the function should perform one test and then set up the next pass. This also frees you from needing to track the index as an argument.

Consider that:

contains("hello", "lo") ==  contains("ello", "lo") ==  contains("llo", "lo") ==  contains("lo", "lo") 
 
 
1
 
vote

No NULL Checks

No debe verificar los valores de entrada nula. Semánticamente no puede dermina un valor de devolución adecuado. Por lo tanto, si al menos un parámetro es nulo que se devuelve, sería tan válido, ya que la devolución falsa, incluso los falsos, a menudo, serán más beneficiosos. Por lo tanto, el valor de retorno será más o menos una convención que una respuesta correcta.

Mi sugerencia es no esperar NULL como un parámetro. Tu firma del método dice "Dame una cadena", por lo que la persona que llama tiene que darte una cadena. Esto es lo menos que la persona que llama debe hacer un valor del tipo de propiedad, ya que NULL puede ser de cualquier tipo que se ve aquí:

  String s = null; Object o = o; Integer i = (Integer) o;   

Evite múltiples declaraciones de retorno

Intente reformular su algoritmo para que tenga una declaración de devolución al final.

El problema es que las construcciones como Break, Continuar y el retorno múltiple no son fáciles de refactorizar. La extracción de métodos fuera del método actual que contiene tales construcciones conducirán a reformular todo su flujo de control.

Naming

Intenta cambiar el nombre I, J, Cuenta e índice para que coincida con el mejor semántico. (por ejemplo, STARTINDEX, OFFSET, WORD2INDEX, ...)

 

No null checks

You should not check for null input values. Semantically you cannot dermine a proper return value. So if at least one parameter is null returning true would be as valid as return false even false will often be more beneficial. So the return value will be more or less a convention than a correct answer.

My suggestion is to not expect null as a parameter. You method signature says "give me a String" so the caller has to give you a String. This is the least the caller should do passing a value of the propert type as null can be of ANY type as seen here:

String s = null; Object o = o; Integer i = (Integer) o; 

Avoid multiple return statements

Try to reformulate your algorithm so you have only one return statement at the end.

The problem is that the constructs like break, continue and multiple return are not refactoring-friendly. Extracting methods out of the current method that contains such constructs will lead to reformulating your whole control flow.

Naming

Try to rename i, j, count and index to match there semantic best. (e.g. startIndex, offset, word2Index, ...)

 
 
       
       

Relacionados problema

1  Árbol cuadrado con mapas y recursión  ( Square tree using maps and recursion ) 
Defina un procedimiento de árbol cuadrado análogo a la Procedimiento de la lista cuadrada del ejercicio. 2.21. Es decir, la lista cuadrada debe comportar...

6  Unión profunda / recursiva, todos, cualquiera, suma, len  ( Deep recursive join all any sum len ) 
Sigo olvidando que el estándar join() solo puede tomar una sola itinerable, así que hice algunas funciones que actúen recursivamente en cualquier argumento ...

3  Hanoi Towers Time Exeeded  ( Hanoi towers time exeeded ) 
Estoy teniendo problemas con un programa de torre de Hanoi simple. Necesito hacer algo para reducir su tiempo. import threading import queue import time L...

3  Código para dividir los regalos por igual  ( Code for dividing gifts equally ) 
Recientemente me encontré con este problema : Es el cumpleaños de Lavanya y varias familias han sido invitadas a la fiesta de cumpleaños. Como es habitu...

10  Función recursiva que genera las permutaciones de una cadena  ( Recursive function that generates the permutations of a string ) 
Estoy buscando una revisión de mi función recursiva que genere las permutaciones de una cadena. ¿Hay mejores formas de hacer esto? var permutations = []; ...

10  Sundoku Solver: marcas de lápiz y paciencia recursiva  ( Sudoku solver pencil marks recursive patience ) 
Aquí está mi intento en Desafío de fin de semana # 3 . fuera de alcance: solo hará 9 * 9 se detendrá en la primera solución podría haber sido más in...

1  Función recursiva, recaudación de cuadrícula  ( Recursive function traversing grid ) 
Soy un juego de construcción donde un jugador debe construir un camino desde la parte inferior de la cuadrícula hasta la parte superior. Cuando se cambia un c...

7  Aplicar acción arbitraria durante la función de generador recursivo  ( Apply arbitrary action during recursive generator function ) 
Tengo esta función de generador recursivo. Traerá un objeto en busca de "hojas", cualquier tecla que no apunte a sub-objetos. Luego aplica una de las dos ac...

27  Sudoku usando un solucionador 'cubierta exacta'  ( Sudoku using exact cover solver ) 
1. Introducción Esta es una solución para Desafío de fin de semana # 3 : un solucionador de sudoku en Python. Funciona traduciendo un rompecabezas de sudok...

2  Selección recursiva y no recursiva  ( Recursive and non recursive selectionsort ) 
Este es un intento ingenuo de escribir versiones recursivas y no recursivas para section .text global _start _start: mov eax, '10' ; asci 10 mov ...




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