1、不使用临时变量,求字符串长度
我们先分析题目,不能使用临时变量也就是说我们无法用另一个数来记录长度并返回。那么考虑递归的思想,即大事化小。本题是求字符串长度,假设该字符串就是 “string" ,我们可以看成是计算一个 ”s" 的长度再求后面的 “tring” 的长度,此时又出现了一个求字符串长度,以此类推,最后可以拆解成求每一个字符的长度加起来。为了能够找到 “s" 后面的那个字符串,这里要使用指针 +1 的操作。
代码实现如下:
#incude <stdio.h>
int Strlen(const char*str)
{
if(*str == '\0')
return 0;
else
return 1+Strlen(str+1);
}
int main()
{
char *p = "abcdef";
int len = Strlen(p);
printf("%d\n", len);
return 0;
}
2、求n的阶乘
n! = n*(n-1) * (n-2) * (n-3).……2*1
可以看作求 n 乘(n-1)的阶乘,即:
fac(n)=n * fac(n-1)
代码实现
int factorial(int n)
{
if(n <= 1)
return 1;
else
return n * factorial(n-1);
}
3、字符串逆序
使用递归实现字符串的逆序排列,注意不是逆序打印
输入:abcdef
输出:fedcba
我们可以先交换开头和结尾,然后在逆序内部字符串
代码实现:
void reverse(char* ch)
{
char* left = ch;
char* right = ch + strlen(ch) - 1;
if (*ch != '\0')
{
//交换
char tmp = *left;
*left = *right;
*right = '\0';
//递归
reverse(ch+1);
*right = tmp;
}
}
int main()
{
char ch[20] = "abcdef";
reverse(ch);
printf("%s\n", ch);
return 0;
}
4、递归实现一个数字的各位之和
输入:1234
输出:10
可以看作:
(123)+4
(12)+3+4
1+2+3+4
代码实现:
int sum(int n)
{
if (n > 9)
return sum(n / 10) + n % 10;
else
return n;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", sum(n));
return 0;
}
5、n 的 k 次方
也就是求 n 乘 n 的 k-1 次方
n^k = n * n^ k-1=n * n * n^ k-2……
代码实现:
int power(int n, int k)
{
while(n>0)
{
return n*power(n,k-1);
}
}
int main()
{
int n = 0;
int k = 0;
scanf("%d%d", &n, &k);
int ret = power(n,k);
printf("%d\n", ret);
return 0;
}