Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Informatik in der Schule » Ruby-Rekursion und Zeichenketten » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Ruby-Rekursion und Zeichenketten
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
CluelessBiologyStudent
Grünschnabel


Dabei seit: 02.12.2015
Beiträge: 3

Ruby-Rekursion und Zeichenketten Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Rekursion

a.)Ich muss folgende Formel bei Ruby eingeben:

def magic(str)
n = str.length;
if n < 2 then
return str;
else
if n % 2 == 0 then
return magic(str[1,n-1]) + str[0,1];
else
return str[0,1] + magic(str[1,n-1]);
end;
end;
end;

Diese soll dann durch die rekursive Auswertung des Funktionsaufrufs "magic("yrbu")" ausführlich beschrieben werden.

(b) Daraus soll danach eine Funktion "contains_substring (text,sub)" gebildet werden, die true zurückliefert wenn sub im Text vorkommt, und false wenn nicht. Zudem soll das Programm eine Funktion für vom Benutzer eingegebene Strings aufrufen und als "Kommt vor" oder "Kommt nicht vor" ausgeben.

(c) Die bei b) geschriebene Funktion soll so umgestellt erden, dass sie nicht mit einer Schleife arbeitet, sondern sich rekursiv aufruft.

Zeichenketten

d.)Es soll eine Prozedur "ersetze!(s, a, b)" geschrieben werden, die alle Vorkommen der Zeichenkettte a in der Zeichenkette s durch die Zeichenkette b ersetzt. Dabei müssen a und b nicht unbedingt Zeichenketten gleicher Länge sein. Die Zeichenkette s soll dabei von links nach rechts verarbeitet werden.


Meine Ideen:
Rekursion

zu a.)bis c.)
Ich habe bereits eine Formel angefangen, komme ab da aber nicht mehr weiter, weiß auch nicht genau ob sie überhaupt richtig ist:

# Language: Ruby, Level: Level 1
def magic(z)
if z > 0 then
return magic(z - 3) * 3; #1
else
return z; #2
end; #3
end; #4

x = magic(2); #5
puts(x); #6

Zeichenketten

d.) Ich habe bereits eine Formel angefangen, die das Wort Affe ausgeben soll:

str = "Alfalfa";
ersetze!(str, "lfa", "e"); # ergibt str = "Aee"
ersetze!(str, "e", "ee"); # ergibt str = "Aeeee"
ersetze!(str, "eee", "ff"); # ergibt str = "Affe"
puts(str);

Zudem weiß ich das man am besten Mutationen mit []= arbeitet.



Vielen Dank wenn ihr mir helfen könnt, diese Aufgaben zu lösen.
04.12.2015 08:41 CluelessBiologyStudent ist offline E-Mail an CluelessBiologyStudent senden Beiträge von CluelessBiologyStudent suchen Nehmen Sie CluelessBiologyStudent in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

a) machen wir doch Kontrollausgaben:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
def magic(str)
	n = str.length;
	if n < 2 then
		return str;
	else
		if n % 2 == 0 then
			puts "magic(" + str[1,n-1] + ")" + "+" + str[0,1]
			return magic(str[1,n-1]) + str[0,1];
		else
			puts str[0,1] + "+" + "magic(" + str[1,n-1] + ")"
			return str[0,1] + magic(str[1,n-1]);
		end;
	end;
end;

puts magic("yrbu")

liefert:
code:
1:
2:
3:
4:
magic(rbu)+y
r+magic(bu)
magic(u)+b
ruby

also magic("yrbu") = "magic("rbu") + "y" = "r" + magic("bu") + "y" = "r" + magic("u") + "b" + "y" = "ruby".

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
#Aufgabe b
def contains_substring (text,sub)
	l1 = text.length
	l2 = sub.length
	for i in 0..l1-l2
		if text[i,l2-1] == sub then
			return "Kommt vor"
		end;
	end;
	return "Kommt nicht vor"
end;

#Aufgabe c
def contains_substring2 (text,sub)
	if sub.length > text.length then
		return "Kommt nicht vor"
	end;
	if text[0, sub.length] == sub then
		return "Kommt vor"
	end;
	return contains_substring2(text[1, text.length - 1], sub);
end;

puts contains_substring2("hallo", "alo")
puts contains_substring2("hallo", "allo")


d) und wo ist jetzt die Funktion selbst?

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 05.12.2015 13:05.

04.12.2015 10:17 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
CluelessBiologyStudent
Grünschnabel


Dabei seit: 02.12.2015
Beiträge: 3

Ruby Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Vielen Dank!! Das hat mir sehr geholfen!

Ich habe aber doch noch ein paar Fragen:

zu c.) was muss ich tun, damit die Funktion ohne weitere rekursive Ausrufe direkt "true" oder "false" angibt?

zu d.) die allgemeine Funktion muss ich selbst schreiben, das was ich geschrieben habe war nur ein Beispiel, welches ich mir selbst ausgedacht habe. Es muss dann noch eine Mutation mit []= eingefügt werden.

Aufgabenstellung:

Schreiben Sie eine Prozedur "ersetze!(s, a, b)", die alle Vorkommen der Zeichenkettte" a" in der Zeichenkette" s2 durch die Zeichenkette" b "ersetzt. Dabei müssen" a "und "b2 nicht unbedingt Zeichenketten gleicher Länge sein. Die Zeichenkette" s" soll dabei von links nach rechts verarbeitet werden.

Ich wäre sehr dankbar, wenn du mir auch dabei helfen könntest.

Vielen, vielen Dank im voraus und fröhlichen Nikolaus!!
05.12.2015 12:41 CluelessBiologyStudent ist offline E-Mail an CluelessBiologyStudent senden Beiträge von CluelessBiologyStudent suchen Nehmen Sie CluelessBiologyStudent in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

c) das passiert bereits. Die Rekursion wird vorzeitig abgebrochen, wenn das Ergebnis feststeht.

d)
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
def ersetze!(s, a, b)
	i = 0
	while i + a.length <= s.length do
		if s[i, a.length] == a then
			s = s[0,i] + b + s[i+a.length,s.length-1]
			i += b.length - a.length
		end;
		i += 1
	end;
	return s;
end;

str = "Alfalfa";
str = ersetze!(str, "lfa", "e"); # ergibt str = "Aee"
str = ersetze!(str, "e", "ee"); # ergibt str = "Aeeee"
str = ersetze!(str, "eee", "ff"); # ergibt str = "Affe"
puts(str);

Kann gut sein, dass das unnötig umständlich ist. Ich habe noch nie mit Ruby gearbeitet.

__________________
Syntax Highlighting fürs Board (Link)
05.12.2015 13:07 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Informatik in der Schule » Ruby-Rekursion und Zeichenketten