Problem

5/8

Đệ quy và lặp lại

Theory Click to read/hide

Để hiểu đệ quy, bạn cần hiểu đệ quy...
 
Lặp lại trong lập trình — theo nghĩa rộng — tổ chức xử lý dữ liệu, trong đó các hành động được lặp lại nhiều lần mà không dẫn đến các cuộc gọi đến chính chúng (không giống như  %BA%D1%83%D1%80%D1%81%D0%B8%D1%8F" title="Recursion" >Đệ quy). Theo nghĩa hẹp — quy trình xử lý dữ liệu tuần hoàn một bước. 
Thông thường các thuật toán lặp ở bước hiện tại (lặp) sử dụng kết quả của cùng một thao tác hoặc hành động được tính ở các bước trước đó.  Một ví dụ về các phép tính như vậy là phép tính các quan hệ lặp lại. 
Một ví dụ đơn giản về giá trị đệ quy là giai thừa: \(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\) Phép tính giá trị ở mỗi bước (lặp lại) là \(N=N \cdot i\) .  Khi tính giá trị của \(N\), chúng tôi lấy giá trị đã được lưu trữ \(N\).

Giai thừa của một số cũng có thể được mô tả bằng cách sử dụng công thức truy hồi:



Bạn có thể nhận thấy rằng mô tả này không gì khác hơn là một hàm đệ quy.
Đây là dòng đầu tiên (\(n <= 1\)) — đây là trường hợp cơ sở (điều kiện kết thúc của đệ quy) và dòng thứ hai là chuyển tiếp sang bước tiếp theo. 
 
Bạn nên hiểu rằng các lệnh gọi hàm liên quan đến một số chi phí bổ sung, do đó phép tính giai thừa không đệ quy sẽ nhanh hơn một chút. 
Kết luận:
chỗ bạn có thể viết chương trình với thuật toán lặp đơn giản, không đệ quy, thì bạn cần viết không đệ quy. Tuy nhiên, có rất nhiều bài toán mà quá trình tính toán chỉ được thực hiện bằng đệ quy.
Mặt khác, thuật toán đệ quy thường dễ hiểu hơn.
 

Problem

 Xác định hàm K(n) trả về số chữ số trong một số tự nhiên đã cho n: 


Viết hàm đệ quy tính số chữ số của số tự nhiên n.

Hàm giai thừa đệ quy sẽ như thế này So sánh thuật toán tìm giai thừa theo cách thông thường, không đệ quy
hàm Giai thừa(n: số nguyên): số nguyên;
bắt đầu
    nếu n> 1 thì
        Giai thừa := n * Giai thừa(n - 1)
    khác
        Giai thừa := 1;
kết thúc;
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!