# Aufgabe aus Schiedermeier



## mahed (29. Jul 2007)

Hallo
Ich benutze das Buch von Reinhard Schiedermeier "Programmieren mit Java. Eine methodische Einführung".

Auf Seite 22 wird die Aufgabe gestellt, man soll ein Programm zur Berechnung der sog. Doppelfaktoriellen schreiben, nachdem zuvor eingeführt wurde, wie man die Fakultät bis n Zahlen berechnet.
Die Doppelfaktorielle ist aber eine Funktion, die aus zwei Funktionen besteht, abhängig davon, ob n gerade oder ungerade ist. 

2*n+1 für n >= 1
2*n für n>= 2.

Ich frage mich jetzt, ob es möglich ist, das Programm nur mit dem Wissen zu schreiben, das man im ersten Kapitel erlangt hat, oder ob dafür zwingend schon die if-Kontrollstruktur notwendig ist (was sie meines erachtens ist), bzw. erlangt man im ersten Kapitel das Wissen nur ich habs nicht gemerkt?

Anders kann ich mir nicht denken, wie man das Programm schreiben soll, und daher finde ich es ein bisschen irritierend, das Lösen einer Aufgabe zu verlangen, die man possibly nicht lösen kann, da benötigter Stoff noch gar nicht behandelt, ich meine Hallo?

Also dann besten Dank für ein paar Postings.

Hier die Version die ich benutze (habe es allerdings erstmal im Internet nachschauen müssen).

```
class DFact
{
	public static void main (String [] args)
	{
		int n;
		int df;
		int i;
		
		n = Integer.parseInt(args [0]);
		df = 1;
		i = 1;
		while(i <= n)
		{
		  if (n%2 == 0) // modulo um zu schauen, obs gerade ist oder nicht
			{
			i = 2;
			}
		  else
			{
			i = 1;
			}
			while(i <= n)
			{	
				df = df * i;
				i = i + 2;
		  	}
		System.out.println(df);
		}
	}
}
```

War schon mächtig stolz auf dieses eines meiner ersten Programme, die ich nur noch selber nachvollziehen musste


----------



## SlaterB (29. Jul 2007)

eine while-Schleife mit Bedingung ist doch immer auch ein if:

```
int k =1;
while (k>0 && bedingung) {
    ...
    k =0;
}
```
also sind solche Überlegungen recht unnötig,

dein Programm finde ich auch sehr merkwürdig,
soll df das Ergebnis sein? 
dass ist anfangs 1 und wird dann evt. mit 1 oder 2, 3 oder 4, 5 oder 6 usw. multiplziert,
da kommt 2*n+1 raus?

die doppelte while-Schleife ist natürlich auch grandios undurchschaubar


----------



## mahed (29. Jul 2007)

Also das Programm für die normale Fakultät sieht folgendermassen aus:



```
class Fact
{
	public static void main(String[] args)
	{
		int n = Integer.parseInt(args[0]);
		int f = 1;
		int i = 1;
		
		while(i <= n)
		{
			f = f * i;
			i = i + 1;
		}
		
		System.out.println(f);
	}
}
```


Ich dachte daran, auf dieser Grundlage das Programm für die Doppelfaktorielle aufzubauen.

Besten Dank jedenfalls für das Posting, bin halt leider noch nicht so vertraut mit "&&", arbeite aber daran.

Dachte eigentlich, dass das irgendwas mit modulo zu tun haben könnte, da n%2 = 0 dann die "gerade" Funktion auslösen könnte und n%2 = 1 die "ungerade" Funktion.

Versuche gerade was im Sinne von 

```
class Fact
{
	public static void main(String[] args)
	{
		int n = Integer.parseInt(args[0]);
		int f = 1;
		int i = n;
		
		while(n%2 = 0 && (i <=n))
		{
			i = i - 2;
			n = n * i;
			
		}
		
		System.out.println(f);
		
		while(n%2 = 1 && (i <=n))
		{
			i = i - 2;
			n = n - 2;
		}
		
		System.out.println(f);
	}
	
}
```


----------



## Der Müde Joe (29. Jul 2007)

Modulo biete sich eigentlich schon an
zB.


```
public class Test{
	
	public static void main(String [] args){
		int result = 0;
		int max = 1000;
		
		while ( result < max){
			//gerade
			if(result%2 == 0){
				result = result * 2 + 1;
			}
			//ungerade
			else{
				result = result * 2;
			}
			System.out.println(result);		
		}
	}	
}
```


----------



## sers (13. Okt 2007)

benutz doch einfach den hinweis aus dem Buch!!
nich raufzählen, sondern runter!!
dann ist es ja egal, ob n gerade oder nich, n - 2 größer gleich 1. also jeweiligen faktor runterzählen...


----------

