C语言:什么是递归?
【摘要】 什么是递归?递归就是函数自己调用自己!所谓递归,就是要有递有归!只递不归,会导致程序崩溃!要在适当的时候终止递归(为了避免崩溃,递归函数一定要包含条件语句)举例:#定义一个递归函数def f(x): //当x=3,调用函数 return x + f(x-1);返回3 + f(2) , f(2)又返回2 + f(1) , f(1)又返回1 + f(0)…当无限调用函数,需要占用一片...
什么是递归?
递归就是函数自己调用自己!
所谓递归,就是要有递有归!只递不归,会导致程序崩溃!
要在适当的时候终止递归(为了避免崩溃,递归函数一定要包含条件语句)
举例:
#定义一个递归函数
def f(x): //当x=3,调用函数
return x + f(x-1);
返回3 + f(2) , f(2)又返回2 + f(1) , f(1)又返回1 + f(0)…当无限调用函数,需要占用一片叫做栈的内存空间,将一些数据存储到栈中,运行结束,数据从栈中取出来,然而只调用不返回,栈会塞满,从而栈溢出。程序终止!
#定义一个递归函数
def f(x): //x=3
if x > 0:
return x + f(x-1);
else:
return 0;
结果:6
#定义一个递归函数
def f(x): //x=100
if x > 0:
return x + f(x-1);
else:
return 0;
1+2+3+4+…+100=5050
什么是函数嵌套调用与递归?
从一个函数调用另一个函数称为函数的嵌套调用
还有一种情况:
在一个函数体内调用自身称为函数的递归调用
函数递归调用简单例子,run(3),run(2),run(1),代入条件判断是否符合。
#include <stdio.h>
#include <stdlib.h>
void run(int num){
if(num==0)
return;
printf("蓝桥杯 我要获奖!\n");
run(num-1); //每递归一次,num减1,最终满足终止条件num==0,递归完成
}
void main(){
run(3); //先定义ー个函数,让它执行3次
}
蓝桥杯 我要获奖!
蓝桥杯 我要获奖!
蓝桥杯 我要获奖!
通过这两个例子是不是更好理解函数嵌套调用与递归,go函数调用到run函数,run函数调用到main函数
#include <stdio.h>
#include <stdlib.h>
void go(){
printf("你可以的\n");
}
void run(){
printf("runA\n");
go();
printf("runB\n");
}
void main(){
printf("helloworld\n");
run();
printf("欢迎来到蓝桥杯\n");
}
helloworld
runA
你可以的
runB
欢迎来到蓝桥杯
有个小技巧:==遇到递归用条件语句!==
递归的产生
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技 术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与 原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直 接求出其解。这自然导致递归过程的产生。
递归的应用
问题的定义是递归的,如阶乘问题。
问题的求解过程是递归的,如汉诺塔问题。
问题采用的数据结构是递归的,如链表中搜索链表中的元素。
递归的数学公式
它是一组等式或不等式;
它的第一式给出了函数初始值,称为边界条件;
边界条件和递归方程是递归的两个基本要素。
它的第二式是用较小自变量的函数值来描述较大自变量的函数值, 称为递归方程;
编写程序:输出斐波那契数列的前30项,要求每行输出5项。
#include <stdio.h> // C语言版本
int fib(int n){// 根据递归式写出函数
if (n==1 || n==2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main(){
for(int i=1;i<=30;i++) // 输出前30项
{
printf("%-10d",fib(i));
if (i%5==0) // 每行输出5项
printf("\n");
}
}
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
10946 17711 28657 46368 75025
121393 196418 317811 514229 832040
4!的递归
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int factorial(int n){
if(n==0)
return 1;
return n*factorial(n-1);
}
void main(){
factorial(4);
}
还有字符串反转递归!
def reverse_string(string s):
if len(s) == 1:
return s
else:
return s[-1] + reverse_string(s[:-1]);
reverse_string('abc'); //调用函数
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)