还原文本的递归方法
Recursive method to revert text
谁能解释一下这段代码如何还原用户输入(这是一个递归):
Procedure revert;
Var text:char;
Begin
Read (text)
If (text <> '.') Then revert;
Write(text);
End;
举个例子吧。
假设用户输入 'Hello.'
- 他输入了字母 'H'。
- 因为
text
等于 'H' 条件 (text <> '.')
为真。
- 所以
revert
又被调用了一次。
- 现在堆栈上有第二个
text
变量,它将
填充用户输入的第二个字母。在这种情况下是
'e'。
- 条件
(text <> '.')
再次成立。所以 revert
被称为
再一次。
- 现在堆栈上有第三个
text
变量,它将
填充用户输入的第三个字母。在这种情况下是
'l'.
- 条件
(text <> '.')
再次成立。所以 revert
被称为
再一次。
- 现在堆栈上有第四个
text
变量,它将
填充用户输入的第三个字母。在这种情况下是
'l'.
- 条件
(text <> '.')
再次成立。所以 revert
被称为
再次。
- 现在堆栈上有第五个
text
变量,它将
填充用户输入的第五个字母。在这种情况下是
'o'.
- 条件
(text <> '.')
再次成立。所以 revert
被称为
再次。
- 现在堆栈上有第六个
text
变量,它将
填充用户输入的第六个字母。在这种情况下是
'.'.
- 现在条件
(text <> '.')
为假! revert
不会
被调用。
- 最上面的
text
变量的值将被写入
安慰。在本例中是“.”。
- 对
revert
的第六次调用现已完成。它正在清理堆栈,所以
第六个 text
变量将从中删除。该计划是
回到原来的位置:第五次调用
revert
。
- 最上面的
text
变量的值将被写入
安慰。在本例中是 'o'.
- 对
revert
的第五次调用现已完成。它正在清理堆栈,所以
第五个 text
变量将从中删除。该计划是
回到原来的位置:第四次调用
revert
.
- 最上面的
text
变量的值将被写入
安慰。在这种情况下,它是 'l'.
- 现在已完成对
revert
的第四次调用。它正在清理堆栈,所以
第四个 text
变量将从中删除。该计划是
回到原来的位置:第三次调用
revert
.
- 最上面的
text
变量的值将被写入
安慰。在这种情况下,它是 'l'.
- 对
revert
的第三次调用现已完成。它正在清理堆栈,所以
第三个 text
变量将从中删除。该计划是
回到原来的位置:第二次调用
revert
.
- 最上面的
text
变量的值将被写入
安慰。在这种情况下,它是 'e'.
- 对
revert
的第二次调用现已完成。它正在清理堆栈,所以
第二个 text
变量将从中删除。该计划是
回到原来的位置:最初的通话
至 revert
.
- 最上面的
text
变量的值将被写入
安慰。在这种情况下,它是 'H'.
- 现在已完成对
revert
的初始调用。它正在清理堆栈,所以
第一个 text
变量将从中删除。该计划是
回到它来的地方:我们不知道。
也许程序结束
- 字符串“.olleH”出现在屏幕上。
import java.io.*;
class revstr
{
static String ans="";
static String rev (String str)
{
if(str.length()==0)
return ans;
else
{
ans+=str.charAt(str.length()-1);
return rev(str.substring(0,str.length()-1));
}
}
}
谁能解释一下这段代码如何还原用户输入(这是一个递归):
Procedure revert;
Var text:char;
Begin
Read (text)
If (text <> '.') Then revert;
Write(text);
End;
举个例子吧。 假设用户输入 'Hello.'
- 他输入了字母 'H'。
- 因为
text
等于 'H' 条件(text <> '.')
为真。 - 所以
revert
又被调用了一次。 - 现在堆栈上有第二个
text
变量,它将 填充用户输入的第二个字母。在这种情况下是 'e'。 - 条件
(text <> '.')
再次成立。所以revert
被称为 再一次。 - 现在堆栈上有第三个
text
变量,它将 填充用户输入的第三个字母。在这种情况下是 'l'. - 条件
(text <> '.')
再次成立。所以revert
被称为 再一次。 - 现在堆栈上有第四个
text
变量,它将 填充用户输入的第三个字母。在这种情况下是 'l'. - 条件
(text <> '.')
再次成立。所以revert
被称为 再次。 - 现在堆栈上有第五个
text
变量,它将 填充用户输入的第五个字母。在这种情况下是 'o'. - 条件
(text <> '.')
再次成立。所以revert
被称为 再次。 - 现在堆栈上有第六个
text
变量,它将 填充用户输入的第六个字母。在这种情况下是 '.'. - 现在条件
(text <> '.')
为假!revert
不会 被调用。 - 最上面的
text
变量的值将被写入 安慰。在本例中是“.”。 - 对
revert
的第六次调用现已完成。它正在清理堆栈,所以 第六个text
变量将从中删除。该计划是 回到原来的位置:第五次调用revert
。 - 最上面的
text
变量的值将被写入 安慰。在本例中是 'o'. - 对
revert
的第五次调用现已完成。它正在清理堆栈,所以 第五个text
变量将从中删除。该计划是 回到原来的位置:第四次调用revert
. - 最上面的
text
变量的值将被写入 安慰。在这种情况下,它是 'l'. - 现在已完成对
revert
的第四次调用。它正在清理堆栈,所以 第四个text
变量将从中删除。该计划是 回到原来的位置:第三次调用revert
. - 最上面的
text
变量的值将被写入 安慰。在这种情况下,它是 'l'. - 对
revert
的第三次调用现已完成。它正在清理堆栈,所以 第三个text
变量将从中删除。该计划是 回到原来的位置:第二次调用revert
. - 最上面的
text
变量的值将被写入 安慰。在这种情况下,它是 'e'. - 对
revert
的第二次调用现已完成。它正在清理堆栈,所以 第二个text
变量将从中删除。该计划是 回到原来的位置:最初的通话 至revert
. - 最上面的
text
变量的值将被写入 安慰。在这种情况下,它是 'H'. - 现在已完成对
revert
的初始调用。它正在清理堆栈,所以 第一个text
变量将从中删除。该计划是 回到它来的地方:我们不知道。 也许程序结束 - 字符串“.olleH”出现在屏幕上。
import java.io.*;
class revstr
{
static String ans="";
static String rev (String str)
{
if(str.length()==0)
return ans;
else
{
ans+=str.charAt(str.length()-1);
return rev(str.substring(0,str.length()-1));
}
}
}