函数的递归
程序用自身的变成技巧成为递归(recursion);
递归的主要思考方式在于:把大事化小
递归的两个必要条件:
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续;
2.每次递归调用之后越来越接近这个限制条件;
1.用递归和非递归的方式求第N个斐波那契数
斐波那契数:1,1,2,3,5,8,13,21,34,,,,,N
规律:从第三项开始,每一项都是前两项的和。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//斐波那契数列
// 1, 1, 2 ,3, 5, 8,13,21,34。。。,n
//非递归
int Factorial_Nd(int n) {
if (n == 1 || n == 2) {
return 1;
}
int cur = 0; //第N项
int Last1 = 1; //第N-1项
int Last2 = 1; //第N-2项
for (int i = 3; i <= n; ++i) {
cur = Last1 + Last2;
Last2 = Last1;
Last1 = cur;
}
return cur;
}
//递归
int Factorial(int n) {
if (n == 1 || n ==2) {
return 1;
}
return Factorial(n - 1) + Factorial(n - 2);
}
int main()
{
int num = 0;
printf("请输入N:");
scanf("%d",&num);
//非递归
printf("第%d项斐波那契数为%d\n", num,Factorial_Nd(num));
//递归
printf("第%d项斐波那契数为%d\n", num, Factorial(num));
system("pause");
return 0;
}
程序运行结果:
2.编写一个函数,实现n^k;
非递归可以结束math.h中的函数 double pow(double x,double y);
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//递归
int Fun2(int num, int k) {
if (k == 0) {
return 1;
}
return num * Fun2(num, k - 1);
}
int main()
{
int num = 0;
int k = 0;
printf("请输入N的值");
scanf("%d",&num);
printf("请输入k的值");
scanf("%d", &k);
//非递归
printf("%d^%d=%d\n",num,k,(int)pow(num,k));
//递归
printf("%d^%d=%d\n", num, k, Fun2(num, k));
system("pause");
return 0;
}
程序运行结果: