斐波那契数
递归公式:(n-1)+(n-2)
//递归实现
int fab(int n) {
if (n == 1 || n == 2) {
return 1;
}
else {
return fab(n - 1) + fab(n - 2);
}
}
int main() {
printf("%d\n", fab(3));
system("pause");
return 0;
}
//非递归实现
int main() {
int f1 = 1;
int f2 = 1;
int f3 = 0;
int i, n;
printf("Enter number:");
scanf("%d", &n);
for (i = 3; i <= n; i++) {
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
printf("%d\n", f3);
system("pause");
return 0;
}
n^k递归实现
递归公式:n*n^k-1
int powr(int n, int k) {
if (k == 0) {
return 1;
}
else {
return n*powr(n, k - 1);
}
}
int main() {
int n = 2;
int k = 3;
int ret;
ret = powr(n, k);
printf("%d\n", ret);
system("pause");
return 0;
}
递归实现顺位打印数字
void Print(int n) {
if (n > 9) {
Print(n / 10);
}
printf("%d ", n % 10);
}
int main() {
int num = 1234;
Print(num);
system("pause");
return 0;
}
递归实现求字符串长度
int strlen(char *str) {
if (*str == '\0') {
return 0;
}
return 1 + strlen(str + 1);
}
int main() {
char *p = "happyeveryday";
int len = strlen(p);
printf("%d\n", len);
system("pause");
return 0;
}
递归n的阶乘
//递归求n的阶乘
int fac(int n) {
if (n == 0) {
return 1;
}
else {
return n * fac(n - 1);
}
}
int main() {
printf("%d\n", fac(2));
system("pause");
return 0;
}
//非递归求n的阶乘
int main() {
int n, i;
double sum = 1;
printf("Enter number:");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
sum *= i;
}
printf("%lf", sum);
system("pause");
return 0;
}
递归将字符串中的字符反向排列
int myStrlen(char *str) {
if (*str == '\0') {
return 0;
}
return 1 + strlen(str + 1);
}
void reverse_string(char *str) {
if (*str) {
int tmp;
int end = myStrlen(str) - 1;
tmp = *str;
*str = str[end];
str[end] = '\0';
reverse_string(str + 1);
str[end] = tmp;
}
}
int main() {
char str[] = "bitekeji";
reverse_string(str);
puts(str);
system("pause");
return 0;
}
递归实现返回数字之和
int DigitSum(int n) {
if (n == 0) {
return 0;
}
return n % 10 + DigitSum(n / 10);
}
int main() {
printf("%d\n", DigitSum(1729));
system("pause");
return 0;
}
递归注意事项:
不要试图用脑海去执行整个递归过程,应该认真分析递归出口,然后再根据题意用递归思想找到一个可行的递归公式,(递归具体执行步骤可以用调试的方法去了解)