Module: 子程序。递归


Problem

5/8

递归和迭代

Theory Click to read/hide

要理解递归,你需要理解递归...
 
迭代 在编程中—从广义上来说——数据处理的组织,其中的动作重复多次,而不会导致对自身的调用(不像  %BA%D1%83%D1%80%D1%81%D0%B8%D1%8F" title="Recursion" >递归)。狭义上——一步循环数据处理过程。 
当前步骤(迭代)的迭代算法通常使用在先前步骤计算的相同操作或动作的结果。  此类计算的一个例子是递归关系的计算。 
递归值的一个简单示例是阶乘:\(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\) 每一步(迭代)的值的计算是 \(N=N \cdot i\) 。 在计算\(N\)的值时,我们取已经存储的值 \(N\) >.

一个数的阶乘也可以用递归公式来描述:



你可能会注意到这个描述只不过是一个递归函数。
这里是第一行 (\(n <= 1\)) —这是基本情况(递归的结束条件),第二行是到下一步的过渡。 
  <正文>
应该理解,函数调用涉及一些额外的开销,因此非递归阶乘计算会稍微快一些。 
结论:
如果您可以使用简单的迭代算法编写程序,无需递归,那么您就需要编写无递归的程序。但是,仍然存在一大类仅通过递归实现计算过程的问题。
另一方面,递归算法通常更容易理解。
 

Problem

 定义一个函数 K(n),返回给定自然数的位数 n: 


编写一个递归函数来计算自然数 n 的位数。

递归阶乘函数看起来像这样 比较以通常的非递归方式查找阶乘的算法
函数阶乘(n:整数):整数;
开始
   如果 n > 1 然后
       阶乘 := n * 阶乘(n - 1)
   否则
       阶乘 := 1;
结束;
x := 1;
for i := 2 to n do
    x := x * i;
writeln(x);
Write the program below
var n: integer;

function CountDigit(n: integer): integer; 
begin
   read(n);
   writeln(CountDigit(n));
end. 

     

Program check result

To check the solution of the problem, you need to register or log in!