用于还原文本的递归方法

时间:2015-08-22 14:15:38

标签: pascal freepascal

有人可以解释一下这段代码如何恢复用户输入(这是递归):

Procedure revert;
Var text:char;
Begin
  Read (text)
  If (text <> '.') Then revert;
  Write(text);
End;

2 个答案:

答案 0 :(得分:1)

让我们通过一个例子来做。 想象一下,用户输入&#39; Hello。&#39;

  • 他输入了字母&#39; H&#39;。
  • 由于text等于&#39; H&#39;条件(text <> '.')为真。
  • 因此再次调用revert
  • 现在堆栈上有第二个text变量,它将会发生 填写用户输入的第二个字母。在这种情况下它 &#39; E&#39 ;.
  • 条件(text <> '.')再次成立。所以调用了revert 再一次。
  • 现在堆栈上有第三个text变量,它将会发生 填写用户输入的第三个字母。在这种情况下它 &#39;升&#39;
  • 条件(text <> '.')再次成立。所以调用了revert 再一次。
  • 现在堆栈上有第四个text变量,它将会发生 填写用户输入的第三个字母。在这种情况下它 &#39;升&#39;
  • 条件(text <> '.')再次成立。所以调用了revert 再来一次。
  • 现在堆栈上有第五个text变量,它将会发生 填写用户输入的第五个字母。在这种情况下它 &#39;○&#39;
  • 条件(text <> '.')再次成立。所以调用了revert 再来一次。
  • 现在堆栈上有第六个text变量,它将会发生 填写用户输入的第六个字母。在这种情况下它 &#39;&#39;
  • 现在条件(text <> '.')是假的! revert不会 被称为。
  • 最顶层text变量的值将写入 安慰。在这种情况下,它是&#39;。&#39;。
  • 现在已完成对revert的第六次调用。它正在清理堆栈 第六个text变量将从中删除。该计划是 回到它来自的位置:第五次打电话给 revert
  • 最顶层text变量的值将写入 安慰。在这种情况下,它是&#39; o&#39;。
  • 现在已完成对revert的第五次调用。它正在清理堆栈 第五个text变量将从中删除。该计划是 回到它来自的位置:第四次打电话给 revert
  • 最顶层text变量的值将写入 安慰。在这种情况下,它是&#39; l&#39;。
  • 现在已完成对revert的第四次调用。它正在清理堆栈 第四个text变量将从中删除。该计划是 回到它来自的位置:第三次打电话给 revert
  • 最顶层text变量的值将写入 安慰。在这种情况下,它是&#39; l&#39;。
  • 现在已完成对revert的第三次调用。它正在清理堆栈 第三个text变量将从中删除。该计划是 回到它来自的位置:第二次打电话给 revert
  • 最顶层text变量的值将写入 安慰。在这种情况下,它是&#39;。
  • 现在已完成对revert的第二次调用。它正在清理堆栈 第二个text变量将从中删除。该计划是 回到它来自的位置:最初的呼叫 到revert
  • 最顶层text变量的值将写入 安慰。在这种情况下,它是&#39; H&#39;
  • 现在已完成对revert的初始调用。它正在清理堆栈 第一个text变量将从中删除。该计划是 回到原来的位置:我们不知道。 也许程序结束
  • 字符串&#39; .olleH&#39;出现在屏幕上。

答案 1 :(得分:-2)

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));
        }
    }
}