对于递归,递归函数直接或者间接地调用自身,函数每一次调用必须进一步的靠近目标,当达到目标时,递归函数就不再调用自身了。阅读递归函数,只要简单的认为递归函数将会执行它的预定任务即可。
尾递归:如果递归调用是函数所执行的最后一项任务,我们把它叫做尾递归。
对于尾递归,我们可以很方便地转换成一个简单循环,完成相同的任务,这就是我们所说的迭代。
如:阶乘和斐波那契数列的问题,用迭代来解决问题,效率就会更高一些。
//编写一个函数实现n^k,使用递归实现
#include<stdio.h>
#include<stdlib.h>
int my_pow(int n, int k)
{
if (k)
{
k--;
return n*my_pow(n, k);
}
else
return 1;
}
int main()
{
int n = 0;
int k = 0;
int ret = 0;
printf("请输入底数:");
scanf("%d", &n);
printf("请输入指数:");
scanf("%d", &k);
ret=my_pow(n,k);
printf("输出结果=%d", ret);
system("pause");
return 0;
}
//写一个递归函数DigitSum(n),输入一个非负整数,返回
//组成它的数字之和,例如,调用DigitSum(1729),则应该返回1 + 7 + 2 + 9,它的和是19
#include<stdio.h>
#include<stdlib.h>
int DigitSum(int n)
{
if (n)
{
return n % 10 + DigitSum(n / 10);
}
return 0;
}
int main()
{
int n=0;
int ret = 0;
printf("请输入一个非负整数:");
scanf("%d", &n);
ret=DigitSum(n);
printf("%d", ret);
system("pause");
return 0;
}
// 编写一个函数reverse_string(char * string)(递归实现)
//实现:将参数字符串中的字符反向排列。
//要求:不能使用C函数库中的字符串操作函数。
#include<stdio.h>
#include<stdlib.h>
char *reverse_string(char * str ,int sz)
{
if (sz>1)
{
char tmp = *str;
*str = *(str + sz - 1);
*(str + sz - 1) = '\0';
reverse_string(str+1, sz-2);
*(str + sz - 1) = tmp;
}
return str;
}
int main()
{
char str[] = "abcdef";
int sz = (sizeof(str) / sizeof(str[0]))-1;
reverse_string(str,sz);
printf("%s", str);
system("pause");
}