国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Home System Tutorial LINUX Recursive operations in software development

Recursive operations in software development

Aug 16, 2024 pm 07:54 PM
linux linux tutorial Red Hat linux system linux command linux certification red hat linux linux video

Recursive operations in software development

Let’s take a look at this classic recursive factorial:

#include
int factorial(int n)
{
int previous = 0xdeadbeef;
if (n == 0 || n == 1) {
return 1;
}
previous = factorial(n-1);
return n * previous;
}
int main(int argc)
{
int answer = factorial(5);
printf("%d\n", answer);
}

Recursive factorial - factorial.c
The idea of ??a function calling itself is difficult to grasp at first. In order to make this process more vivid and concrete, the following figure shows the situation of the endpoint on the stack when factorial(5) is called and the line of code n == 1 is reached:

Recursive operations in software development

Every call to factorial generates a new stack frame. The creation and destruction of these stack frames is what makes the recursive version factorially slower than its corresponding iterative version. The accumulation of these stack frames may exhaust stack space before the call returns, causing your program to crash.

These worries often exist in theory. For example, the stack frame takes 16 bytes for each factorial (this may depend on the stack arrangement and other factors). If you're running a modern x86 Linux kernel on your computer, you typically have 8 GB of stack space, so n in a factorial program can go up to about 512,000. This is a huge result, and it takes 8,971,833 bits to represent it, so stack space is not an issue at all: a tiny integer—even a 64-bit integer—is stored in our stack space. It has overflowed thousands of times before it ran out.

We will look at the use of CPU in a while. For now, let’s take a step back from bits and bytes and treat recursion as a general technology. Our factorial algorithm boils down to pushing the integers N, N-1, … 1 onto a stack and multiplying them in reverse order. We actually use a program call stack to achieve this, here are the details of it: we allocate a stack on the heap and use it. Although the call stack has special characteristics, it is just another data structure that you can use however you want. I hope this diagram helps you understand this.

When you think of the call stack as a data structure, something becomes clearer: piling up those integers and then multiplying them together is not a good idea. That's a flawed implementation: it's like taking a screwdriver to drive a nail. It is more reasonable to use an iterative process to calculate the factorial.

However, there are so many screws that we can only pick one. There is a classic interview question where there is a mouse in a maze and you have to help the mouse find a piece of cheese. Suppose a rat can turn left or right in a maze. How do you model to solve this problem?

Like many problems in real life, you can simplify this problem of mice looking for cheese into a graph, with each node of a binary tree representing a position in the maze. You can then have the mouse turn left wherever possible, and when it reaches a dead end, backtrack and turn right again. Here’s an example of a mouse walking a maze:

Recursive operations in software development

Every time it reaches the edge (line), let the mouse turn left or right to reach a new position. If you are blocked in any direction you turn, it means that the relevant edge does not exist. Now, let’s discuss it! This process, whether you use a call stack or other data structures, is inseparable from a recursive process. And using the call stack is very easy:

#include
#include "maze.h"
int explore(maze_t *node)
{
int found = 0;
if (node == NULL)
{
return 0;
}
if (node->hasCheese){
return 1;// found cheese
}
found = explore(node->left) || explore(node->right);
return found;
}
int main(int argc)
{
int found = explore(&maze);
}

Recursive Maze Solving Download
When we find cheese in maze.c:13, the stack looks like this. You can also see more detailed data in the GDB output, which is the data collected using the command.

Recursive operations in software development

It demonstrates the good behavior of recursion because this is a problem suitable for using recursion. And it's no surprise: when it comes to algorithms, recursion is the rule, not the exception. It shows up when you're searching, when you're traversing trees and other data structures, when you're parsing, when you need to sort -- it's everywhere. Just as pi or e are known as "gods" in mathematics because they are the basis of everything in the universe, recursion is the same: it just exists in the structure of calculations.

What’s great about Steven Skienna’s excellent book A Guide to Algorithm Design is that he interprets his work through “war stories” as a means to demonstrate the algorithms behind solving real-world problems. This is the best resource I know for expanding your knowledge of algorithms. Another reading is McCarthy's original paper on LISP implementation. Recursion is both its name and its fundamental principle in the language. The paper is both readable and interesting, and it's exciting to see a master's work at work.

迷路の問題に戻りましょう。ここで再帰を殘すのは困難ですが、コールスタックを通じてそれを達成しなければならないという意味ではありません。 RRLL のような文字列を使用してターンを追跡し、この文字列を使用してマウスの次の動きを決定できます。あるいは、チーズハントの全體的なステータスを記録するために何か他のものを割り當てることもできます。引き続き再帰的なプロセスを?qū)g裝しますが、必要なのは獨自のデータ構造を?qū)g裝することだけです。

スタック呼び出しの方が適しているため、これはより複雑に思えます。各スタック フレームは、現(xiàn)在のノードだけでなく、そのノードでの計算の狀態(tài)も記録します (この場合、左のみに移動させたか、右に移動しようとしたか)。したがって、コードは重要ではなくなりました。しかし、オーバーフローや期待されるパフォーマンスを恐れて、この優(yōu)れたアルゴリズムを放棄してしまうことがあります。それは愚かです!

ご覧のとおり、スタック領域は非常に大きく、スタック領域が使い果たされる前に他の制限が発生することがよくあります。一方で、問題の規(guī)模をチェックして、問題を安全に処理できるかどうかを確認できます。 CPU への懸念は、広く流通している 2 つの問題例、ダム階乗と恐ろしい記憶のない O(2n) フィボナッチ再帰によって引き起こされています。これらはスタック再帰アルゴリズムを正しく表現(xiàn)したものではありません。

実際、スタック操作は非常に高速です。通常、データへのスタック オフセットは非常に正確で、キャッシュ內(nèi)のホット データであり、特殊な命令がそのデータに対して動作します。同時に、ヒープ上に割り當てられた獨自のデータ構造の使用に伴うオーバーヘッドも大きくなります。スタック呼び出し再帰よりも複雑でパフォーマンスの悪い実裝メソッドを作成する人がよくいます。最後に、最新の CPU のパフォーマンスは非常に優(yōu)れており、一般に CPU がパフォーマンスのボトルネックになることはありません。プログラムのパフォーマンスとそのパフォーマンスの測定について常に考えるのと同じように、プログラムの単純さを犠牲にすることを検討するときは注意してください。

次の記事はスタックの探索シリーズの最後の記事になります。テールコール、クロージャ、およびその他の関連概念について學びます。次に、私たちの古い友人である Linux カーネルに飛び込みます。読んでいただきありがとうございます!

Recursive operations in software development

The above is the detailed content of Recursive operations in software development. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Postman Integrated Application on CentOS Postman Integrated Application on CentOS May 19, 2025 pm 08:00 PM

Integrating Postman applications on CentOS can be achieved through a variety of methods. The following are the detailed steps and suggestions: Install Postman by downloading the installation package to download Postman's Linux version installation package: Visit Postman's official website and select the version suitable for Linux to download. Unzip the installation package: Use the following command to unzip the installation package to the specified directory, for example /opt: sudotar-xzfpostman-linux-x64-xx.xx.xx.tar.gz-C/opt Please note that "postman-linux-x64-xx.xx.xx.tar.gz" is replaced by the file name you actually downloaded. Create symbols

The difference between programming in Java and other languages ??Analysis of the advantages of cross-platform features of Java The difference between programming in Java and other languages ??Analysis of the advantages of cross-platform features of Java May 20, 2025 pm 08:21 PM

The main difference between Java and other programming languages ??is its cross-platform feature of "writing at once, running everywhere". 1. The syntax of Java is close to C, but it removes pointer operations that are prone to errors, making it suitable for large enterprise applications. 2. Compared with Python, Java has more advantages in performance and large-scale data processing. The cross-platform advantage of Java stems from the Java virtual machine (JVM), which can run the same bytecode on different platforms, simplifying development and deployment, but be careful to avoid using platform-specific APIs to maintain cross-platformity.

Where is the pycharm interpreter? Where is the pycharm interpreter? May 23, 2025 pm 10:09 PM

Setting the location of the interpreter in PyCharm can be achieved through the following steps: 1. Open PyCharm, click the "File" menu, and select "Settings" or "Preferences". 2. Find and click "Project:[Your Project Name]" and select "PythonInterpreter". 3. Click "AddInterpreter", select "SystemInterpreter", browse to the Python installation directory, select the Python executable file, and click "OK". When setting up the interpreter, you need to pay attention to path correctness, version compatibility and the use of the virtual environment to ensure the smooth operation of the project.

How to manually install plugin packages in VSCode How to manually install plugin packages in VSCode May 15, 2025 pm 09:33 PM

The steps to manually install the plug-in package in VSCode are: 1. Download the .vsix file of the plug-in; 2. Open VSCode and press Ctrl Shift P (Windows/Linux) or Cmd Shift P (Mac) to call up the command panel; 3. Enter and select Extensions:InstallfromVSIX..., then select .vsix file and install. Manually installing plug-ins provides a flexible way to install, especially when the network is restricted or the plug-in market is unavailable, but attention needs to be paid to file security and possible dependencies.

Detailed introduction to each directory of Linux and each directory (reprinted) Detailed introduction to each directory of Linux and each directory (reprinted) May 22, 2025 pm 07:54 PM

[Common Directory Description] Directory/bin stores binary executable files (ls, cat, mkdir, etc.), and common commands are generally here. /etc stores system management and configuration files/home stores all user files. The root directory of the user's home directory is the basis of the user's home directory. For example, the home directory of the user user is /home/user. You can use ~user to represent /usr to store system applications. The more important directory /usr/local Local system administrator software installation directory (install system-level applications). This is the largest directory, and almost all the applications and files to be used are in this directory. /usr/x11r6?Directory for storing x?window/usr/bin?Many

After installing Nginx, the configuration file path and initial settings After installing Nginx, the configuration file path and initial settings May 16, 2025 pm 10:54 PM

Understanding Nginx's configuration file path and initial settings is very important because it is the first step in optimizing and managing a web server. 1) The configuration file path is usually /etc/nginx/nginx.conf. The syntax can be found and tested using the nginx-t command. 2) The initial settings include global settings (such as user, worker_processes) and HTTP settings (such as include, log_format). These settings allow customization and extension according to requirements. Incorrect configuration may lead to performance issues and security vulnerabilities.

MySQL installation tutorial teach you step by step the detailed steps for installing and configuration of mySQL step by step MySQL installation tutorial teach you step by step the detailed steps for installing and configuration of mySQL step by step May 23, 2025 am 06:09 AM

The installation and configuration of MySQL can be completed through the following steps: 1. Download the installation package suitable for the operating system from the official website. 2. Run the installer, select the "Developer Default" option and set the root user password. 3. After installation, configure environment variables to ensure that the bin directory of MySQL is in PATH. 4. When creating a user, follow the principle of minimum permissions and set a strong password. 5. Adjust the innodb_buffer_pool_size and max_connections parameters when optimizing performance. 6. Back up the database regularly and optimize query statements to improve performance.

Comparison between Informix and MySQL on Linux Comparison between Informix and MySQL on Linux May 29, 2025 pm 11:21 PM

Informix and MySQL are both popular relational database management systems. They perform well in Linux environments and are widely used. The following is a comparison and analysis of the two on the Linux platform: Installing and configuring Informix: Deploying Informix on Linux requires downloading the corresponding installation files, and then completing the installation and configuration process according to the official documentation. MySQL: The installation process of MySQL is relatively simple, and can be easily installed through system package management tools (such as apt or yum), and there are a large number of tutorials and community support on the network for reference. Performance Informix: Informix has excellent performance and

See all articles