Trikotnik
Napiši rekurzivno metodo, ki izračuna ploščino trikotnika Sierpinskega
dane stopnje. Osnovni trikotnik je kar črni enakokraki trikotnik.
Namig
Namesto da »izrežeš« beli trikotnik, raje računaj ploščine črnih trikotnikov – razmisli, kako na tak način prideš iz ene stopnje do druge!
Rešitev (Java)
public class Sierpinski {
public static double a = 1.0;
public static int stopnja = 0;
public static double visina = Math.sqrt(3.0)/2.0;
// izracuna ploscino trikotnika Sierpinskega stopnje stopnja in stranico a
public static double sierpinski(double a, int stopnja) {
if (stopnja == 0) {
return a*a*visina/2.0;
} else {
/* gremo nivo nize - izracunamo ploscino treh trikotnikov Sierpinskega
seveda za eno stopnjo nize in s polovicno stranico
*/
return 3.0*sierpinski(0.5*a,stopnja-1);
}
}
public static void main(String [] args) {
System.out.println("Ploscina trikotnika Sierpinskega stopnje " + stopnja + " s stranico " + a + " je " + sierpinski( a, stopnja));
}
}
Rešitev (C#)
class Program {
public static double PlSierpinskega(int n, double a) { // stopnja in dolžina stranice trikotnika
if (n == 0) return a * a * Math.Sqrt(3) / 4; // ploščina osnovnega trikotnika
return 3 * PlSierpinskega(n - 1, a) / 4; // vaka naslednja stopnja ima 3 trikotnike za 1/4 manjše
}
// preizkus metode
public static void Main(string[] args) {
Console.WriteLine(PlSierpinskega(3,1));
Console.WriteLine();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
Rešitev (C#)
class MainClass
{
public static double Sierp(int n, double p) {
if (n==0) {
return p;//pri stopnji 0 je plošcina izracunana
//glede na vneseno velikost stranice
} else {
return 3*Sierp(n-1,p/4);//vsak trikotnik se deli na štiri
//enake dele , plošcina pa je od treh trikot.
}
}
public static void Main(string[] args) {
//glavni program za preizkus
Console.WriteLine("Vnesi dolžino stranice trikotnika v cm: ");
double a = double.Parse(Console.ReadLine());
Console.WriteLine("Vnesi željeno stopnjo trikotnika Sierpinskega: ");
int n = int.Parse(Console.ReadLine());
double p = a*a*Math.Sqrt(3)/4;//izracunamo plošc. da je preglednejše
// klicanje metode Sierp
double pS = Sierp(n,p);//pS je plošcina Sierpinskega trik.
Console.WriteLine("Plošcina trikotnika Sierpinskega je: " + pS + " cm2, \nali " + pS/10000 +" m2.");
Console.ReadLine();
}
}
Rešitev (C#)
class Program
{
//Trikotnik: naredi Rekurzivno metodo, ki izračuna ploščino enakokrakega trikotnika Sierpinskega dane stopnje.
public static double PloscSierp(double osnovna, double visina, int n) {
if (n == 0) { //ustavitveni pogoj
return osnovna * visina / 2.0;// vrne ploščino trikotnika
} else { //trikotnik razpade na 3 manjše trikotnike s polovičnimi stranicami, zato pomnožimo s 3 in zmanjšamo stopnjo za 1
return 3 * (PloscSierp(osnovna / 2, visina / 2, n - 1));
}
}
//metodo kličemo iz glavnega programa
static void Main(string[] args) {
//vnesemo in preberemo osnovnico, višino in stopnjo trikotnika Sierpinskega v cm
Console.Write("Vnesi osnovno stranico trikotnika (cm): ");
int osnovna = int.Parse(Console.ReadLine());
Console.Write("Vnesi višino trikotnika (cm): ");
int visina = int.Parse(Console.ReadLine());
Console.Write("Vnesi stopnjo Sierpentinskega : ");
int stopnja = int.Parse(Console.ReadLine());
double plo = PloscSierp(osnovna, visina, stopnja);//klic metode
Console.WriteLine("\nPlosčina trikotnika Sierpinskega s stopnjo " + stopnja + " je " + plo + " cm2.");//izpis ploščine enakokrakega trikotnika
Console.Write("\nZa konec pritisni katerokoli tipko... ");
Console.ReadKey(true);
}
}
Rešitev (C#)
class Program
{
public static double SierpinskiTr(int n, double plos) {
if (n==0) { //pri pogoju, da je stopnja 0....
return plos;//se vrne kot rezultat plošcina
//osnovnega trikotnika
} else {
return SierpinskiTr(n-1,plos/4);//rekurzivna metoda izračuna..
//..eno četrtino ploščine predhodne stopnje
}
}
public static void Main(string[] args) {
//vnesemo podatke za izračun Sierpinskega trikotnika
Console.WriteLine("Vnesi dolžino stranice trikotnika v m: ");
double a = double.Parse(Console.ReadLine());
Console.WriteLine("Vnesi stopnjo Sierpinskega trikotnika: ");
int n = int.Parse(Console.ReadLine());
double plos = (a*a*(Math.Sqrt(3)))/4;//formula za enakostraničen trikotnik
//pokličemo metodo oz. izpišemo rezultat
Console.WriteLine("Plošcina Sierpinskega trikotnika je: " + SierpinskiTr(n,plos) + " kvadratnih metrov.\n");
//izpis služi samo za kontrolo izračunane ploščine trikotnika
Console.WriteLine("Ploščina osnovnega trikotnika (stopnja 0)" + "je "+plos+" kvadratnih metrov.");
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}