大家好,又见面了,我是你们的朋友全栈君。
递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。 所以递归要有两个要素,结束条件与递推关系
注:
递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当被调函数返回的时候,调用函数中的变量依然会保持原先的值,否则也不可能实现反向输出。
#include <stdio.h>
int factorial(int n)
{
int result;
if (n<0) //判断例外
{
printf("输入错误!\n");
return 0;
}
else if (n==0 || n==1)
{
result = 1; //回推墙
}
else
{
result = factorial(n-1) * n; //递推关系,这个数与上一个数之间的关系。
}
return result;
}
int main(){
int n = 5; //输入数字5,计算5的阶乘
printf("%d的阶乘=%d",n,factorial(n));
return 0;
}
程序在计算5的阶乘的时候,先执行递推,当n=1或者n=0的时候返回1,再回推将计算并返回。由此可以看出递归函数必须有结束条件。
斐波那契数列指的是这样一个数列:
0, 1, 1, 2, 3, 5, 8, 13, 21, ···
这个数列从第三项开始,每一项都等于前两项之和.
#include <stdio.h>
long fibonacci( long num )
{
if ( num == 0 || num == 1 )
{
return num;
}
else
{
return fibonacci( num -1 ) + fibonacci( num -2 );
}
}
void main()
{
long number;
puts("请输入一个正整数: ");
scanf("%ld", &number);
printf("斐波那契数列第%ld项为: %ld\n", number, fibonacci( number ) );
}
小明为了学好英语,需要每天记单词,第一天记1个,第二天记2个依次类推,请用代码完成,算出小明第10天开始的时候会了多少个单词?
分析: 墙(结束条件)是“第一天记1个” 递推关系是“第n天记的单词= 第n-1天记的单词数量+n”
#include <stdio.h>
/* 定义获取单词数量的函数 */
int getWordNumber(n)
{
if(n == 1)
{
return 1; //回推墙
}
else{
return getWordNumber(n-1)+n ; //递推关系
}
}
int main()
{
int num = getWordNumber(10); //获取会了的单词数量
printf("小明第10天记了:%d个单词。\n", num);
return 0;
}
递归函数特点:
1. 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;
2. 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;
3. 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;
4. 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;
5. 递归函数中必须有终止语句。
一句话总结递归:自我调用且有完成状态。
综上:
函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N次局部变量、N次形参、N次调用函数地址、N次返回值,势必效率低.
循环能干的事,递归都能干;递归能干的循环不一定能干
对于我们,能用循环解决的,尽量不适用递归.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/194828.html原文链接:https://javaforall.cn