目录
2.调用DigitSum(1729),则应该返回1+7+2+9,它的和是19输入:1729,输出:19
1.什么是递归?
程序调用自身的编程技巧成为递归。
递归作为一种算法再程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的。
一种方法,他通常把一个问题层层次化为一个原问题相似的规模较小的问题来求解。
递归策略 只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大的减少了程序的代码量。
2.例题
1.用递归的方法算出n的k次方
n的k次方可分解即为:
通过这样的一个思路可以将n的k次方的求解用递归的思路去做。
分为k>0,k=0,k<0三种情况。
k>0时,很好理解,就是通过n*power(n-1)的思路去做。
k=0时,任何数的0次方为1,直接return 1.0,即可。
k<0时,通过1.0去除n的-k次方,例如2的-3次方就等于1.0/(2的3次方)。
此处用double类型是为了用1.0除时,得出的时小数而不是整型除出来的整数。
#include<stdio.h>
double power(int n, int k)
{
if (k > 0)
return n * power(n,k - 1);
else if (k == 0)
return 1.0;
else
return 1.0 / power(n,-k);
}
int main()
{
int a = 0, b = 0;
printf("输入两个数代表前一个数的后一个数次方\n");
scanf("%d%d", &a, &b);
double ret = power(a, b);
printf("%d的%d次方是%lf\n", a, b, ret);
return 0;
}
2.调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19
这题可以通过用n%10得出最后一个数,得到之后n/10,再进行递归前面的操作直到n的值小于10,返回n的值即可。在中间穿插加法,将每一次除余的值和接下来递归调用的n/10相加即可算出答案。
如图所示,分解步骤。
#include<stdio.h>
int DigitSum(int n)
{
if (n > 9)
return n % 10 + DigitSum(n /10);
else
return n;
}
int main()
{
int m = 0;
printf("输入一个数\n");
scanf("%d", &m);
int ret = DigitSum(m);
printf("%d\n", ret);
return 0;
}
3.用递归的方法打印每一个数(1234->1 2 3 4)
输入一个n,可以通过n%10得出的值,之后再计算函数n/10,实现递归,但是这样的打印出来的数会和原来的数顺序相反,可以用以下代码,图解如下。
#include<stdio.h>
void Print(int n)
{
if (n > 9)
{
Print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int m = 0;
printf(" 输入个数\n");
scanf("%d", &m);
Print(m);
return 0;
}
4.通过递归的方法求n的阶乘
阶乘就是对于数n,所有绝对值小于或等于n的同余数之积。例如5的阶乘就是5*4*3*2*1。
递归思路求阶乘就是例如5!可以转换成 5*4! -> 5*4*3! ->5*4*3*2! -> 5*4*3*2*1。
#include<stdio.h>
int Fac(int n)
{
if (n > 1)
return n * Fac(n - 1); //递归调用函数Fac
else
return 1;
}
int main()
{
printf("输入一个数\n");
int m = 0;
scanf("%d", &m);
int ret = Fac(m);
printf("%d的阶乘是%d\n", m, ret);
return 0;
}
5.用递归的方法求斐波那契数列的第n个数
斐波那契数列是指第一个数是1,第二个数是1,后面的每个数都是前面的两个数的和。
1 1 2 3 5 8 13 21 34 55...这就是斐波那契数列。
当输入的数为1或2时,得到的数直接就是1,不用计算。
当输入的数大于2时,递归调用Fac函数,直到调用到n=2时,return 1,便可算出第n个斐波那契数。
#include<stdio.h>
int Fac(int n)
{
if (n > 2)
return Fac(n - 1) + Fac(n - 2);
else
return 1;
}
int main()
{
printf("输入要求的斐波那契数的位置(输入的数应该大于0)\n");
int m = 0;
scanf("%d", &m);
int ret = Fac(m);
printf("%d个斐波那契数为%d\n", m, ret);
return 0;
}