Da es eine ganze Reihe von Lösungen gibt, werde ich mich mit dem "Kritik" -Teil Ihrer Frage befassen. Ein paar Anmerkungen: Ich habe einige Tippfehler behoben und festgestellt, wo ich sie gemacht habe. Wenn ich mich geirrt habe, erwähne ich es in den Kommentaren und erkläre, was los ist. Ich werde auf einige Dinge hinweisen, die Sie vielleicht bereits wissen, nehmen Sie sich also bitte keine Sorgen, wenn ich es tue. Einige Kommentare mögen wählerisch erscheinen, aber ich weiß nicht, wo Sie sich auf Ihrer Reise befinden, also müssen Sie davon ausgehen, dass Sie gerade erst anfangen.
CREATE function Palindrome (
@String Char
, @StringLength Int
, @n Int
, @Palindrome BIN
, @StringLeftLength Int
Schließen Sie IMMER die Länge mit einem char
oder einer varchar
Definition ein. Aaron Bertrand spricht hier ausführlich darüber . Er redet, varchar
aber das gilt auch char
. Ich würde dafür eine verwenden, varchar(255)
wenn Sie nur relativ kurze Zeichenfolgen oder vielleicht eine varchar(8000)
für größere oder sogar möchten varchar(max)
. Varchar
ist für Zeichenfolgen mit variabler Länge char
nur für feste Zeichenfolgen . Da Sie nicht sicher sind, wie lange die Zeichenfolge verwendet wird varchar
. Auch ist es binary
nicht bin
.
Als Nächstes müssen Sie nicht alle diese Variablen als Parameter angeben. Deklarieren Sie sie in Ihrem Code. Nehmen Sie etwas nur in die Parameterliste auf, wenn Sie es weitergeben möchten. (Sie werden sehen, wie dies am Ende aussieht.) Sie haben auch @StringLeftLength, verwenden es aber nie. Also werde ich es nicht erklären.
Das nächste, was ich tun werde, ist ein bisschen neu zu formatieren, um ein paar Dinge klar zu machen.
BEGIN
SET @n=1
SET @StringLength = Len(@String) -- Missed an @
WHILE @StringLength - @n >1
IF Left(@String,@n)=Right(@String, @StringLength) -- More missing @s
SET @n = @n + 1 -- Another missing @
SET @StringLength = @StringLength - 1 -- Watch those @s :)
RETURN @Palindrome = 1 -- Assuming another typo here
ELSE
RETURN @Palindrome =0
END
Wenn Sie sich die Art und Weise ansehen, wie ich die Einrückung vorgenommen habe, werden Sie feststellen, dass ich Folgendes habe:
WHILE @StringLength - @n >1
IF Left(@String,@n)=Right(@String, @StringLength)
SET @n = @n + 1
Das ist , weil Befehle wie WHILE
und IF
nur die erste Zeile des Codes nach ihnen beeinflussen. Sie müssen einen BEGIN .. END
Block verwenden, wenn Sie mehrere Befehle wünschen. So fixierend, dass wir bekommen:
WHILE @StringLength - @n > 1
IF Left(@String,@n)=Right(@String, @StringLength)
BEGIN
SET @n = @n + 1
SET @StringLength = @StringLength - 1
RETURN @Palindrome = 1
END
ELSE
RETURN @Palindrome = 0
Sie werden bemerken, dass ich nur einen BEGIN .. END
Block in den Ordner eingefügt habe IF
. Das liegt daran, dass die IF
Anweisung, obwohl sie mehrere Zeilen lang ist (und sogar mehrere Befehle enthält), immer noch eine einzelne Anweisung ist (die alles abdeckt, was in IF
und in den ELSE
Teilen der Anweisung ausgeführt wird).
Als nächstes erhalten Sie nach beiden eine Fehlermeldung RETURNs
. Sie können eine Variable ODER ein Literal zurückgeben. Sie können die Variable nicht gleichzeitig setzen und zurückgeben.
SET @Palindrome = 1
END
ELSE
SET @Palindrome = 0
RETURN @Palindrome
Jetzt sind wir in der Logik. Lassen Sie mich zunächst darauf hinweisen, dass die LEFT
und RIGHT
Funktionen, die Sie verwenden, großartig sind, aber Ihnen die Anzahl der Zeichen geben werden, die Sie aus der angeforderten Richtung übergeben. Angenommen, Sie haben das Wort "Test" bestanden. Beim ersten Durchgang erhalten Sie Folgendes (Entfernen von Variablen):
LEFT('test',1) = RIGHT('test',4)
t = test
LEFT('test',2) = RIGHT('test',3)
te = est
Offensichtlich haben Sie das nicht erwartet. Sie würden wirklich substring
stattdessen verwenden möchten . Mit der Teilzeichenfolge können Sie nicht nur den Startpunkt, sondern auch die Länge eingeben. So würden Sie erhalten:
SUBSTRING('test',1,1) = SUBSTRING('test',4,1)
t = t
SUBSTRING('test',2,1) = SUBSTRING('test',3,1)
e = s
Als nächstes erhöhen Sie die Variablen, die Sie in Ihrer Schleife verwenden, nur in einer Bedingung der IF-Anweisung. Ziehen Sie die Variableninkrementierung vollständig aus dieser Struktur heraus. Das erfordert einen zusätzlichen BEGIN .. END
Block, aber ich muss den anderen entfernen.
WHILE @StringLength - @n > 1
BEGIN
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
SET @Palindrome = 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
Sie müssen Ihren WHILE
Zustand ändern , um den letzten Test durchführen zu können.
WHILE @StringLength > @n
Und last but not least, wie es jetzt aussieht, testen wir nicht das letzte Zeichen, wenn es eine ungerade Anzahl von Zeichen gibt. Zum Beispiel mit 'ana' wird das n
nicht getestet. Das ist in Ordnung, aber es tut mir leid, dass wir ein einzelnes Buchstabenwort berücksichtigen müssen (wenn Sie möchten, dass es als positiv gilt). Das können wir also tun, indem wir den Wert im Voraus festlegen.
Und jetzt haben wir endlich:
CREATE FUNCTION Palindrome (@String varchar(255))
RETURNS Binary
AS
BEGIN
DECLARE @StringLength Int
, @n Int
, @Palindrome binary
SET @n = 1
SET @StringLength = Len(@String)
SET @Palindrome = 1
WHILE @StringLength > @n
BEGIN
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
SET @Palindrome = 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
RETURN @Palindrome
END
Ein letzter Kommentar. Ich bin ein großer Fan von Formatierung im Allgemeinen. Es kann Ihnen wirklich helfen, die Funktionsweise Ihres Codes zu erkennen und auf mögliche Fehler hinzuweisen.
Bearbeiten
Wie Sphinxxx sagte, haben wir immer noch einen Fehler in unserer Logik. Sobald wir die Taste drücken ELSE
und @Palindrome
auf 0 setzen , macht es keinen Sinn, fortzufahren. In der Tat konnten wir zu diesem Zeitpunkt nur RETURN
.
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
RETURN 0
Angesichts der Tatsache, dass wir jetzt nur @Palindrome
für "Es ist immer noch möglich, dass dies ein Palindrom ist" verwenden, macht es keinen Sinn, es zu haben. Wir können die Variable loswerden und unsere Logik nur dann auf Kurzschluss bei Ausfall (der RETURN 0
) und RETURN 1
(einer positiven Reaktion) umschalten, wenn sie den gesamten Weg durch die Schleife zurücklegt. Sie werden feststellen, dass dies unsere Logik tatsächlich etwas vereinfacht.
CREATE FUNCTION Palindrome (@String varchar(255))
RETURNS Binary
AS
BEGIN
DECLARE @StringLength Int
, @n Int
SET @n = 1
SET @StringLength = Len(@String)
WHILE @StringLength > @n
BEGIN
IF SUBSTRING(@String,@n,1) <> SUBSTRING(@String, @StringLength,1)
RETURN 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
RETURN 1
END
LTRIM(RTRIM(...))
Leerzeichen?