» »

[NALOGA] Java: Rekurzija

[NALOGA] Java: Rekurzija

Timon ::

pozdravljeni!
prosil bi za pomoč pri nalogi:
Računski izrazi v prefiksni obliki so sestavljeni tako, da je najprej podan operator in nato operanda, ki sta prav tako prefiksna izraza. Realizirajte program, ki izračuna vrednost prefiksnega izraza. Na primer: vrednost izraza +,+,4,3,-,2,1 je 8 (ustreza prefiksnemu izrazu (4+3)+(2-1).
program moram realizirati z rekurzijo.
hvaležen bom za vsako pomoč.
LP Timon

Timon ::

anyone?

alexa-lol ::

namig...zacni od desne proti levi

LeQuack ::

Tu je neka hitra rešitev. Nisem preveč testiral.
Progam zaženeš z:
java PrefiksaRekurzija izraz
Primer:
java PrefiksaRekurzija +,+,4,3,-,2,1


import java.math.BigDecimal;
import java.util.Arrays;

/**
 * Izračun rekurzije s prefiksno (polish) notacijo.
 * 
 * @author David Sedlar
 */
public class PrefiksaRekurzija {

	/**
	 * Glavna metoda
	 * 
	 * @param args argumenti, prvi argument je izraz
	 */
	public static void main(String[] args) {
		String[] izrazParsed = null;
		
		if(args.length > 0)
			izrazParsed = args[0].split(",");
		else
			System.exit(0);
		
		BigDecimal result = polishCalculate(izrazParsed);
		
		System.out.format("Rezultat: %.3f", result);
	}

	/**
	 * Izracun izraza.
	 * 
	 * @param izraz izraz v obliki tabele
	 * @return Rezultat izraza
	 */
	private static BigDecimal polishCalculate(String[] izraz)
	{
		if(izraz.length == 1)
			return new BigDecimal(izraz[0]);
		
		else if (izraz.length > 2)
		{
			String operator = izraz[0];
			
			int sredina = vrniSredino(izraz, 1, 1);
			
			String[] leviOperand = Arrays.copyOfRange(izraz, 1, sredina);
			String[] desniOperand = Arrays.copyOfRange(izraz, sredina, izraz.length);
			
			if (operator.equals("*"))
				return polishCalculate(leviOperand).multiply(polishCalculate(desniOperand));
			else if (operator.equals("/"))
				return polishCalculate(leviOperand).divide(polishCalculate(desniOperand));
			else if (operator.equals("-"))
				return polishCalculate(leviOperand).subtract(polishCalculate(desniOperand));
			else if (operator.equals("+"))
				return polishCalculate(leviOperand).add(polishCalculate(desniOperand));
		}
		
		return BigDecimal.ZERO;
	}
	
	/**
	 * Preveri ali je niz operator.
	 * 
	 * @param str Niz
	 * @return true, če je niz operator.
	 */
	private static boolean isOperator(String str)
	{
		if(str.matches("[*/+-]"))
			return true;
			
		return false;
	}
	
	/**
	 * Najdi sredino izraza.
	 * 
	 * @param strArray Izraz brez vodilnega operatorja
	 * @param remaining Koliko operandov še rabimo
	 * @param pos Trenutna pozicija
	 * @return Pozicija sredine izraza
	 */
	private static int vrniSredino(String[] strArray, int remaining, int pos)
	{
		if (remaining == 0)
			return pos;
		else if(!isOperator(strArray[pos]))
			return vrniSredino(strArray, --remaining, ++pos);
		else
			return vrniSredino(strArray, ++remaining, ++pos);
	}
}
Quack !

Zgodovina sprememb…

  • spremenil: LeQuack ()

Timon ::

LeQuack...
najlepša hvala za podano rešitev....

Spura ::

Dost kul resitev LeQuack.
Edina pripomba bi bla, da bi slo tudi brez tistih array kopiranj.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Naloga iz Putka - UPM

Oddelek: Programiranje
242223 (1559) NejcSSD
»

Pomoč pri programiranju z javo

Oddelek: Programiranje
203572 (2499) milc
»

[C#]Računanje iz stringa?

Oddelek: Programiranje
121334 (1196) jernejl
»

[C] bitni operator (strani: 1 2 3 )

Oddelek: Programiranje
1125568 (4401) Thomas
»

[C#] izračun enačbe

Oddelek: Programiranje
61665 (1493) delfy

Več podobnih tem