c语言递归问题
请问什么是递归?这段代码中有没有递归#include<stdio.h>#include<stdlib.h>intf(intm,intn){if(n==0)return1;...
请问什么是递归?这段代码中有没有递归
#include<stdio.h>
#include<stdlib.h>
int f(int m,int n){
if(n==0) return 1;
if(m==0) return 0;
if(n>m) return f(m,m);
return f(m,n-1)+f(m-n,n);
}
int main(){
int m,n;
printf("请分别输入苹果和盘子的个数:\n");
scanf("%d %d",&m,&n);
printf("共有%d种不同的放法",f(m,n));
} 展开
#include<stdio.h>
#include<stdlib.h>
int f(int m,int n){
if(n==0) return 1;
if(m==0) return 0;
if(n>m) return f(m,m);
return f(m,n-1)+f(m-n,n);
}
int main(){
int m,n;
printf("请分别输入苹果和盘子的个数:\n");
scanf("%d %d",&m,&n);
printf("共有%d种不同的放法",f(m,n));
} 展开
1个回答
展开全部
首先我们回答一下,你的这个题目中是有用到递归的。
我们先来了解下什么是递归:
递归的定义:直接或间接调用自己的函数成为递归函数(recursionfunction)。在求解某些具有随意性的复杂问题时经常使用递归,例如求解阶乘或者两个数的最大公约数等。因为这时解的具体“大小”不受限制,函数可以一直递归调用,直到问题解决。
递归的要求:递归函数必须定义一个终止条件;否则,函数就会“永远”递归下去,这意味着函数会一直调用自身直到程序栈耗尽,这种“永远”递归下去的现象叫做“无限递归错误”(infiniterecursion error)。
递归的特点:
1、在函数f()中,会对函数f()自己进行调用。
2、无限递归实际上是不允许的;递归函数必须定义一个终止条件,即什么情况下终止递归,终止继续调用自己,如果没有终止条件,那么函数将一直调用自己,知道程序栈耗尽,这时候等于是写了一个Bug!
3、 递归算法解题通常代码比较简洁,但不是很容易读懂。
4、 递归的调用需要建立大量的函数的副本,尤其是函数的参数,每一层递归调用时参数都是单独的占据内存空间,他们的地址是不同的,因此递归会消耗大量的时间和内存。而非递归函数虽然效率高,但相对比较难编程。
5、 递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。
如果以上对你有帮助,青采纳一下, 谢谢。
我们先来了解下什么是递归:
递归的定义:直接或间接调用自己的函数成为递归函数(recursionfunction)。在求解某些具有随意性的复杂问题时经常使用递归,例如求解阶乘或者两个数的最大公约数等。因为这时解的具体“大小”不受限制,函数可以一直递归调用,直到问题解决。
递归的要求:递归函数必须定义一个终止条件;否则,函数就会“永远”递归下去,这意味着函数会一直调用自身直到程序栈耗尽,这种“永远”递归下去的现象叫做“无限递归错误”(infiniterecursion error)。
递归的特点:
1、在函数f()中,会对函数f()自己进行调用。
2、无限递归实际上是不允许的;递归函数必须定义一个终止条件,即什么情况下终止递归,终止继续调用自己,如果没有终止条件,那么函数将一直调用自己,知道程序栈耗尽,这时候等于是写了一个Bug!
3、 递归算法解题通常代码比较简洁,但不是很容易读懂。
4、 递归的调用需要建立大量的函数的副本,尤其是函数的参数,每一层递归调用时参数都是单独的占据内存空间,他们的地址是不同的,因此递归会消耗大量的时间和内存。而非递归函数虽然效率高,但相对比较难编程。
5、 递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。
如果以上对你有帮助,青采纳一下, 谢谢。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询