PL/SQL创建回文测试函数



我正在sqldeveloper.exe中工作,我想

归档一个工作的回文测试函数。

然而,由于一些不太明显的原因

word VARCHAR2(255)或函数标识符对齐

用红色油漆。谁来给我指路好吗

在这条绝望的路上?提前感谢!

编辑:现在,我只拿

偶数基数的回文到

账户。

我写的定义:

CREATE OR REPLACE FUNCTION PALINDROME(WORD VARCHAR2(255)) RETURN
INT IS
N := LENGTH(WORD) / 2;
I := 1;
J := LENGTH(WORD);
BEGIN
WHILE I <= N AND SUBSTR(WORD, I, 1) = SUBSTR(WORD, J, 1) LOOP
I := I + 1;
J := J - 1;
END LOOP;

IF I = N + 1 THEN
RETURN 1;
ELSE
RERURN 0;
END IF;
END PALINNDROME;

你:

  • 不需要在函数签名中指定size;
  • RERURN代替RETURN
  • 不要在变量上设置类型
  • PALINNDROME在函数末尾拼写错误。

你可以这样修改:

CREATE OR REPLACE FUNCTION PALINDROME(
WORD VARCHAR2
) RETURN INT
IS
N PLS_INTEGER := LENGTH(WORD) / 2;
I PLS_INTEGER := 1;
J PLS_INTEGER := LENGTH(WORD);
BEGIN
WHILE I <= N AND SUBSTR(WORD, I, 1) = SUBSTR(WORD, J, 1) LOOP
I := I + 1;
J := J - 1;
END LOOP;
IF I = N + 1 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END PALINDROME;
/

注意:当单词长度为奇数时,不需要特殊情况,因为中间的字母总是等于它本身。

但是你可以简化为:

CREATE OR REPLACE FUNCTION PALINDROME(
WORD VARCHAR2
) RETURN INT
IS
BEGIN
FOR I IN 1 .. LENGTH(word)/2 LOOP
IF SUBSTR(WORD, I, 1) <> SUBSTR(WORD, -I, 1) THEN
RETURN 0;
END IF;
END LOOP;
RETURN 1;
END PALINDROME;
/

db<此处小提琴>

同时适用于偶数和奇数长度,并且不需要区分(它在两种情况下工作相同):

create or replace function palindrome_check(str varchar2) return number as
begin
return case when length(str) > 1
then case when substr(str, 1, 1) != substr(str, -1, 1) then 0
else palindrome_check(substr(str, 2, length(str) - 2))
end
else 1
end;
end;
/

这实现了明显的递归:如果字符串为空或长度为1,则它是一个回文。如果长度大于等于2,则比较第一个字符和最后一个字符。如果它们不一样,那么这个字符串就不是回文。如果它们相同,则从字符串中删除它们并检查剩余的子字符串是否为回文。

递归是昂贵的;通过适当的优化级别,PL/SQL优化器使用for循环重写函数,因此我们不需要担心这个问题。

with
test_strings (str) as (
select null     from dual union all
select 'x'      from dual union all
select 'zz'     from dual union all
select 'ab'     from dual union all
select 'lol'    from dual union all
select 'lot'    from dual union all
select 'abba'   from dual union all
select 'mmmm'   from dual union all
select 'mama'   from dual union all
select 'radar'  from dual union all
select 'poker'  from dual union all
select 'pullup' from dual
)
select str, palindrome_check(str) as is_palindrome from test_strings;
STR    IS_PALINDROME
------ -------------
1
x                  1
zz                 1
ab                 0
lol                1
lot                0
abba               1
mmmm               1
mama               0
radar              1
poker              0
pullup             1

相关内容

  • 没有找到相关文章

最新更新