c语言函数的递归调用是什么,c语言递归函数详解
首先,什么是递归
调用程序本身的编程技巧叫做递归。作为一种算法,递归在编程语言中被广泛使用。一个过程或函数在其定义或描述中有一个直接或间接调用自身的方法。它通常将一个大而复杂的问题逐层转化为一个与原问题相似的更小的问题来解决。递归策略只需要少量的程序来描述解题过程中所需的重复计算,大大减少了程序的代码量。考虑递归的主要方法是最小化大的东西。
递归的两个必要条件:
有一个约束,当这个约束满足时,递归就不会继续。
每次递归调用后,它越来越接近这个限制。
int main()
printf(呵呵\ n );
main();
返回0;
}
该函数调用自己,并不断打印“呵呵”但程序会在一会儿停止自己。这不是真正的递归,而是无限循环(递归的两个条件不满足)
递归实现:接收一个整数值(无符号)并按顺序打印它的每一位。例如:输入:1234,输出:4321
作废打印(无符号整数)
如果(n ^ 9)
打印(n/10);
printf(%d ,n % 10);
int main()
无符号int num=0;
scanf(%u ,编号);
//递归——函数调用自身。
打印(数字);
返回0;
}
的基本实现逻辑如图所示:
![image . png](https://s 2.51 CTO . com/images/20220425/1650890354614516 . png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type _ zmfuz 3 poz w5 nagvpdgk=/resize,m_fixed,w_750)
nbsp
编写递归代码时要注意:
1.你不能死递归,有跳出条件,每个递归都接近跳出条件。
2.递归层次不能太深(可能会发生堆栈溢出)
# #二。递归和迭代
求第n个斐波那契数,(可以递归或迭代实现)(不考虑溢出)
我们知道这样一个数列:1,1,2,3,5,8,13,21,34 …这样第n个数等于第n-1个数加上第n-2个数之和就是* *斐波纳契数列* *
-递归实现求斐波那契数,直接看代码:
中间纤维(中间纤维)
如果(n=2)
返回1;
其他
返回光纤(n - 1)光纤(n-2);
int main()
int n=0;
scanf(%d ,
int ret=Fib(n);
printf(%d\n ,ret);
返回0;
}
当我们找到一个小的斐波那契数时,计算机会快速计算。但是当我们要求一个很大的数时,比如第50个斐波那契数,计算机就要花很长时间(大约五分钟)。你可以试一试。
为什么这么慢?因为递归实现效率太低,要重复很多计算(计算层次太多)。
代码实现的基本逻辑如图所示:
我们可以看看在代码的计算过程中,步骤n=3(计算第三个斐波那契数)要执行的次数:
在计算第四十个斐波那契数时,需要计算第三个斐波那契数超过3000万次。可想而知递归实现的效率有多低。而且计算量太大会导致程序崩溃。
迭代实现求斐波那契数,直接看代码:
中间纤维(中间纤维)
int a=1;
int b=1;
int c=1;
当(n 2)
c=a b;
a=b;
b=c;
n-;
返回c;
int main()
int n=0;
scanf(%d ,
int ret=Fib(n);
printf(%d\n ,ret);
返回0;
}
迭代计算速度快。
提示:
很多问题都是用迭代的形式来解释的,只是因为它比非递归的形式更清晰。
然而,许多问题的迭代实现往往不如递归实现高效。虽然代码的可读性稍微差一些。
当问题相当复杂,难以用迭代实现时,递归实现的简单性可以补偿运行成本。
第三,典型的递归问题
有兴趣的可以了解一下:
河内塔问题,青蛙跳台阶问题
这些都是典型的递归问题。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。