当前位置:网站首页>1142_ SiCp learning notes_ Functions and processes created by functions_ Linear recursion and iteration
1142_ SiCp learning notes_ Functions and processes created by functions_ Linear recursion and iteration
2022-07-07 07:31:00 【grey_ csdn】
All learning summary :GitHub - GreyZhang/g_SICP: learn SICP and hack lisp.
The first said , The title is named after the translation and adjustment of text information . If combined C language , It is more suitable to call it subfunction or function function combined by subfunction .


This is the opening word of this chapter , But there are some interesting things to think about . such as , As a professional programmer, you need to have a more vivid and specific thinking ability . In the process of becoming a professional , Must learn how to deal with different scenes to deal with the image 、 Specific thinking . We need to describe the whole function in the way of this sub function 、 Global information and behavior . natural , Many sub functions will have their own state information to be maintained .

This is a recursive factorial function implementation , The following figure is a specific description of each step using the replacement method .

And this , It is an iterative implementation and deployment description . Judge the difference between recursion and iteration , The main difference is whether the intermediate state of the program is automatically processed by the parser rather than whether the function is called by itself . This point , I didn't think deeply when dealing with other designs before .
According to this idea , In fact, you can design one according to the gourd and the gourd C Language version of “ Recursive iteration ”:
#include
#include
void fac(uint32_t n, uint32_t *p_counter, uint32_t *p_result)
{
if(*p_counter > n)
{
/* result is stored to the memory @ p_result */
return;
}
else
{
*p_result *= *p_counter;
*p_counter += 1U;
fac(n, p_counter, p_result);
}
}
int main(void)
{
uint32_t n = 5;
uint32_t c = 1U;
uint32_t r = 1U;
fac(n, &c, &r);
printf("result is %d\n", r);
n = 10;
c = 1U;
r = 1U;
fac(n, &c, &r);
printf("result is %d\n", r);
n = 12;
c = 1U;
r = 1U;
fac(n, &c, &r);
printf("result is %d\n", r);
return 0;
}
test :

In the test above , Added one python Comparison of . among ,python Is a completely recursive implementation :
def fac(n):
if n == 1:
return 1
else:
return n * fac(n - 1)
print(fac(5))
print(fac(10))
print(fac(12))
Judging from the test results , Within a certain parameter range , This C The version calculation of is still correct .


As the level of recursion increases , The information that the parser needs to track increases linearly . This process is called linear recursion . As the depth of recursion increases , More and more information needs to be managed and maintained . therefore , The above two processing ideas : Recursion and iteration should not only focus on the processing depth in the replacement model when comparing the resource consumption of their algorithms , We should also pay attention to the horizontal expansion width . Vertical represents mainly time consumption , The horizontal actually involves the consumption of time and storage resources .

But recursion does not necessarily meet such conditions , This is why the recursion discussed here is specifically proposed as linear recursion . And through the expansion of the end part , In fact, there is also a recursive method with basically constant resource consumption , For example, tail recursion . For me, , This is indeed another new concept .
边栏推荐
- mips uclibc 交叉编译ffmpeg,支持 G711A 编解码
- Pass parent component to child component: props
- Le Service MySQL manque dans le service informatique
- JS decorator @decorator learning notes
- MIPS uclibc cross compile ffmpeg, support g711a encoding and decoding
- Jesd204b clock network
- PostgreSQL source code (59) analysis of transaction ID allocation and overflow judgment methods
- Mobx knowledge point collection case (quick start)
- ../ And/
- Outlier detection technology of time series data
猜你喜欢

Interviewer: what development models do you know?

How to * * labelimg

云备份项目

三、高质量编程与性能调优实战 青训营笔记

mips uclibc 交叉编译ffmpeg,支持 G711A 编解码

Non empty verification of collection in SQL

Dynamics CRM server deployment - restore database prompt: the database is in use

二、并发、测试笔记 青训营笔记

Fast quantitative, abbkine protein quantitative kit BCA method is coming!

計算機服務中缺失MySQL服務
随机推荐
面试官:你都了解哪些开发模型?
聊聊异步编程的 7 种实现方式
How do I get the last part of a string- How to get the last part of a string?
MySQL service is missing from computer service
Readonly read only
IP address
抽丝剥茧C语言(高阶)数据的储存+练习
Cloud backup project
freeswitch拨打分机号源代码跟踪
詳解機器翻譯任務中的BLEU
点亮显示屏的几个重要步骤
考研失败,卷不进大厂,感觉没戏了
gatk4中的interval是什么??
外包干了三年,废了...
Docker compose start redis cluster
记一个并发规则验证实现
js小练习
$refs: get the element object or sub component instance in the component:
Torefs API and toref API
C language (high-level) data storage + Practice