当前位置:网站首页>Understanding recursion with examples
Understanding recursion with examples
2020-11-10 10:46:00 【osc_08xf0119】
0. What is recursion
Before you say what recursion is , I think you should be able to use loops to solve some problems in reading . What is that cycle ? Loop is a program structure that needs to perform a function repeatedly in a program . It is by the conditions in the circulatory body , Determine whether to continue a function or exit the loop .
for example :1+2+3+4+……+10 How much ?( We exclude mathematical formulas )
The first solution is to use loops to solve .
The second solution is to use recursion .
You can see , A loop is the repeated execution of code within a certain region , Until the termination conditions are met , If not controlled , And it will form a cycle of death . And recursion is calling itself in function body , While using recursion , Be sure to pay attention to the end conditions , If not controlled , Will call yourself endlessly , Until the stack overflows back , Because every time a function is called, it creates a stack frame on the stack , The stack frame will pop up after the function call , And the stack size is not infinite , So too many recursive calls will lead to stack overflow . And the characteristic of recursive call is every recursion , To create a new stack frame , And keep the previous environment ( Stack frame ), Until the end condition . So recursive calls must be clear about the end conditions , Don't have a dead cycle , And avoid the stack being too deep ..
If you go to the advantages and disadvantages of Baidu loop and recursion , There may be such an answer :
A recursive algorithm :
advantage : The code is concise 、 Clear , And it's easy to verify the correctness .( If you really understand the algorithm , Or you'll be more dizzy )
shortcoming : It needs more function calls to run , If the call level is deep , Need to add extra stack handling , For example, parameter transfer requires stack pressing and other operations , It will have a certain impact on the efficiency of implementation . however , For some problems , If you don't use recursion , That would be extremely ugly code .
Loop algorithm :
advantage : Fast , Simple structure .
shortcoming : It doesn't solve all the problems . Some problems are suitable for recursion instead of loops . If it's not difficult to use a loop , It's better to use cycle .
I think the advantages and disadvantages are summed up in a lot of contact with loops and recursion , For us this little white , Basically, there is no need to tangle , We can't understand , So let's not think about it for the moment , As it says , If you really understand the algorithm , Or you'll be more dizzy .
Let's go on to see , For the top 1+2+3+4+……+10 The simple question of how much is equal to , Loop and recursion can solve , And recursion doesn't show the simplicity of its code , Clear . So I don't think we can compare loops with recursion , Take the sequential structure , Branching structure , Loop structure , Modular structure , For these four structures , Loop has always been a basic content , Recursion is an algorithm for solving specific problems , It's also a kind of cycle in essence , For the above questions , The advantages of recursive algorithms are not obvious , It's a little skeptical , So when you solve a problem , It depends on the complexity of the problem , According to the complexity of the problem, different algorithms are adopted , Rather than say , I learned recursion , I should use it , Because the book says its code is concise .
And then I want to use recursion , The most important tip , Remember :
- Make sure that this recursive function works ( No specific code is required )
- Find recursive end condition
- Find the equivalent relation or the least recursive model of the function
- Don't try to track recursive processes
The following through the use of pithy formula to solve the problem from easy to difficult to understand recursion :
1. Fibonard sequence
The Fibonacci sequence refers to a sequence that looks like this :
This sequence starts at number one 3 A start , Each of these terms is equal to the sum of the first two terms , This is also a common problem in recursion .
First step :
Make sure that this recursive function works , What does this function do ? That's the output number n Item value .
int fun(int n)
{
}
The second step :
Find recursive end condition , When n Less than or equal to 1 perhaps 2 When , It's time to end recursion .
int fun(int n)
{
if(n<=2)
{
return 1;
}
}
The third step :
Find the equivalent relation of function , It is shown in the preceding paragraph that the sequence starts from 3 A start , Each of these terms is equal to the sum of the first two terms , That is to say f(n)=f(n-1)+f(fn-2).
int fun(int n)
{
if(n<=2)
{
return 1;
}
return fun(n-1)+fun(n-2);
}
2. The little frog went up the steps
A frog can jump up at a time 1 Stepped steps , You can jump on it 2 level , Ask the frog to jump on one n How many jumps are there in total .
First step , It is true that recursive functions act , seek n How many kinds of jump methods are there in the steps of the steps .
The second step , Indeed, the end condition , When the step equals 0,1,2, There were 0,1,2 Methods , We can sort this out .
int fun(int n)
{
if(n<=2)
{
return n;
}
}
The third step , Determine the equivalent relation , When there is n Steps , Select jump 1 rank , That's all fun(n-1) Methods , Select jump 2 rank , That's all fun(n-2) Methods . The sum of the two methods is the total .
int fun(int n)
{
if(n<=2)
{
return n;
}
return fun(n-1)+fun(n-2);
}
3. Hantata
The more famous is hannota ( Also known as the river tower ) problem , Hanoi Tower originated from an ancient legend in India . Vatican made three diamond pillars when he created the world , Stack on a column from bottom to top in order of size 64 A golden disk . Brahman ordered Brahman to rearrange the disc from below on another pillar in order of size . And stipulate , You can't enlarge a disc on a small disc , Only one disc can be moved between the three pillars at a time , And it must be the top disk , This question is still difficult , Let's analyze the problem .
A Column as source ,B Columns as auxiliary columns ,C Column as target pillar .
set up N Count the sets , When N be equal to 1 when , Just one step :A——C Here's the picture :
set up N Count the sets , When N be equal to 2 when , It takes three steps :A——B,A——C,B——C Here's the picture :
set up N Count the sets , When N be equal to 3 when , need 7 Step :A——C,A——B,C——B,A——C,B——A,B——C,C——A Here's the picture :
When N As we grow older , More and more steps are needed , When N be equal to 64, If you move correctly once a second , It also takes 5845.42 More than one hundred million , And the earth still exists 45 In one hundred million, , This number is too large ! So about recursion , We must not track the process of large recursion , The key is to find the minimum recursion model or the equivalent relation of recursion mentioned above .
First step , We're going to show the message in a black box , Step several which plate moves from which pillar to which post .
This print function needs 4 Parameters and a global variable are used to output the number of steps .
void move(int id, char form, char to)
{
cout << " The first " << sum++ << " Step : take " << id << " Plate from " << form << " Move to " << to<<endl;
}
And determine the purpose of the function : Output step which plate moved from which column to which column , We use move Function to output .
The second step , Find the recursive end condition , When n be equal to 0 Or 1( Another way of writing , I didn't write ), As an end condition .
The third step , It's the search for the minimal recursive model .
We have three pillars and n null , So the definition of a function should be :void fun(int n, char a, char b, char c),a,b,c Three columns are corresponding respectively . We're looking for a minimal recursive model :fun(n) The previous step fun(n-1) How can we go there? . When n be equal to 1 when , Directly from the plate A The column moved to B Just a column , When n be equal to 2 when , Pictured above , It takes three steps , It's also the minimal recursive model we're looking for , When n=2 when
fun(n - 1, a, c, b); Denotes marked as n-1 disc , from A The column passes through the auxiliary column C Move to B column
move(n, a, c); Indicates marked as n Disk , from A The column moves to C column
fun(n - 1, b, a, c); Denotes marked as n-1 disc , from B The column passes through the auxiliary column A Move to C column
take n-1 As a whole ,n and n-1 Just the three fixed steps , The complete code is as follows :
int sum=1; // Record the steps
void move(int id, char form, char to)
{
cout << " The first " << sum++ << " Step : take " << id << " Plate from " << form << " Move to " << to<<endl;
}
void fun(int n, char a, char b, char c)
{
if (n == 0)return;
fun(n - 1, a, c, b);
move(n, a, c);
fun(n - 1, b, a, c);
}
int main(int argc, char** argv) {
while (1)
{
sum = 0;
int x;
cin >> x;
fun(x, 'A', 'B', 'C');
}
return 0;
}
}
Here are examples , Study slowly , You will find that recursion is a magic thing , I can be understood by an average person like me , I think you all understand , And learning recursion also has to mention a term called iteration , About iteration , Later on .
版权声明
本文为[osc_08xf0119]所创,转载请带上原文链接,感谢
边栏推荐
- To speed up the process of forming a global partnership between lifech and Alibaba Group
- Q & A and book donation activities of harbor project are in hot progress
- [paper reading notes] rosane, robust and scalable attributed network embedding for sparse networks
- csdn bug8:待加
- Swoole 如何使用 Xdebug 进行单步调试
- .MD语法入门
- Leetcode: binary tree (4)
- 自定义注解!绝对是程序员装逼的利器!!
- 区块链论文集【三十一】
- Bartender2021实现安全远程标签打印,年终全新发布
猜你喜欢
用例子理解递归
Understanding of learning to estimate 3D hand pose from single RGB images
一不小心画了 24 张图剖析计网应用层协议!
Hystrix 如何解决 ThreadLocal 信息丢失
Call the open source video streaming media platform dawinffc
One of the 10 Greatest formulas in the world is well known
想花钱速学互联网行业,大概花两三个月的时间,出来好找工作吗
上线1周,B.Protocal已有7000ETH资产!
csdn bug1:待加
The use of Python PIP command
随机推荐
Bartender2021 realizes secure remote label printing, new year-end release
想花钱速学互联网行业,大概花两三个月的时间,出来好找工作吗
【goang】sync.WaitGroup详解
Custom annotation! Absolutely is the sharp weapon that programmer installs force!!
高通骁龙875夺安卓处理器桂冠,但外挂5G基带成为它的弊病
layer.prompt(options, yes) - 输入层
Multibank group announced record financial results with gross profit of $94 million in the first three quarters of 2020
专业之旅——GitHub 热点速览 Vol.45
不用懂代码,会打字就可以建站?1111 元礼包帮你一站配齐!
nodejs 个人学习笔记(imook)pm2
ElasticSearch 集群基本概念及常用操作汇总(建议收藏)
Collection of blockchain theory [31]
【高级测试工程师】新鲜出炉的三套价值18K的自动化测试面试(网易、字节跳动、美团)
一个 Task 不够,又来一个 ValueTask ,真的学懵了!
[paper reading notes] rosane, robust and scalable attributed network embedding for sparse networks
He doubled the fluency of the long list of idle fish app
js 基础算法题(一)
《Python Cookbook 3rd》笔记(2.4):字符串匹配和搜索
Hong Kong listed companies transfer cards to acquire 42.5% equity of chuangxinzhong and plan to speed up the distribution of marketing services
jsliang 求职系列 - 09 - 手写浅拷贝和深拷贝