1、递归和非递归分别实现求第n个斐波那契数。
void num1 (int *p, int n)//非递归求第n个数的斐波那契数的函数
{
int i = 0;
p[0] = 1;
p[1] = 1;
for (i=2; i<n; i++)
{
p[i] = p[i-2]+ p[i-1];
}
}
int num2 (int n)//递归求第n个数的斐波那契数的函数
{
if (n==1 || n == 2)
{
return 1;
}
else
{
return num2(n-1)+num2(n-2);
}
}
int main()
{
int arr[10];
int i = 0, n = 0;
scanf ("%d", &n);
num1 (arr, n);
printf ("第%d个斐波那契数是:%d(非递归)\n", n, arr[n-1]);
num2 (n);
printf ("第%d个斐波那契数是:%d( 递归)\n", n, num2(n));
system ("pause");
return 0;
}
/*
运行结果:
6
第6个斐波那契数是:8(非递归)
第6个斐波那契数是:8( 递归)
请按任意键继续. . .
*/
2、编写一个函数实现n^k,使用递归实现
int jiechen(int n, int k)
{
if (k == 0)
{
return 1;
}
else
{
return (n * jiechen(n, k-1));
}
}
int main()
{
int i = 0;
int k = 0;
printf ("i的k次方:\n");
printf ("i = ");
scanf ("%d", &i);
printf ("k = ");
scanf ("%d", &k);
if (i<0)
{
printf ("输入有误!!\n");
}
else
{
printf ("%d的%d次方是:%d\n", i, k, jiechen (i, k));
}
system ("pause");
return 0;
}
/*
运行结果:
i的k次方:
i = 3
k = 3
3的3次方是:27
请按任意键继续. . .
*/
3、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
int DigitSum(int n)
{
int sum = 0;
while (n)
{
sum += n%10 ;
n = n / 10;
}
return sum;
}
int main()
{
int a = 0;
scanf ("%d", &a);
printf ("%d\n", DigitSum(a));
system ("pause");
return 0;
}
/*
运行结果:
1729
19
请按任意键继续. . .
*/
4. 编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
思路:
定义一个char型变量ch,只要字符串string没有遇到 ‘\0’,就让ch等字符串首字符,然后让原本的首字符等于字符串最后一个字符,让最后一个字符等于’\0’,然后调用函数本身,参数为(string+1),从字符串第二个字符开始继续递归。这样就可以吧后半部分字符串移到前一部分,最后再把字符ch赋给字符串最后的一个字符,完成字符串反向排列。
#include <stdio.h>
#include <stdlib.h>
int length(char *p)
{
int i = 0;
while (*p++)
{
i++;
}
return i;
}
void reverse_string(char * string)
{
int n = length(string);
char ch;
if(!(*string))
{
return ;
}
else
{
ch = string[0];
string[0] = string[n-1];
string[n-1] = '\0';
reverse_string(string +1);
string[n-1] = ch;
}
}
int main()
{
char arr[] = {"abcdef"};
printf ("变换前:\n");
printf ("%s", arr);
printf ("\n");
reverse_string(arr);
printf ("变换后:\n");
printf ("%s", arr);
printf ("\n");
system ("pause");
return 0;
}
5.递归和非递归分别实现strlen
#include <stdio.h>
#include <stdlib.h>
int my_strlen(char *arr)
{
int i = 0;
for (i=0; arr[i]!='\0'; i++)
{
;
}
return i;
}
int len_recursion (char *arr)
{
if (*arr == '\0')
{
return 0;
}
else
{
return 1+len_recursion(arr+1);
}
}
int main()
{
char arr[] = {"abcdefgh"};
int ret1 = my_strlen(arr);
int ret2 = len_recursion (arr);
printf ("len = %d(非递归)\n", ret1);
printf ("len = %d(递归)\n", ret2);
system ("pause");
return 0;
}
6.递归和非递归分别实现求n的阶乘
int factorial(int a)//非递归算阶乘
{
int i = 0, f = 1;
for (i=1; i<=a; ++i)
{
f *= i;
}
return f;
}
int factorial_recursion(int a)//递归求阶乘
{
if (a==0 || a==1)
{
return 1;
}
else
{
return a*factorial_recursion(a-1);
}
}
int main()
{
int a = 0;
printf("请输入一个正整数:");
scanf ("%d", &a);
if(a<0)
{
printf ("输入错误!!\n");
}
else
{
printf ("%d的阶乘是:%d(非递归)\n", a, factorial(a));
printf ("%d的阶乘是:%d(递归)\n", a, factorial_recursion(a));
}
system ("pause");
return 0;
}
/*
运行结果:
请输入一个正整数:5
5的阶乘是:120(非递归)
5的阶乘是:120(递归)
请按任意键继续. . .
*/
7.递归方式实现打印一个整数的每一位
#include <stdio.h>
#include <stdlib.h>
void print_num(int n)
{
if(n>0&&n<10)
{
printf ("%d ", n);
}
else
{
print_num (n/10);
printf ("%d ", n%10);
}
}
int main()
{
int n = 123456789;
print_num(n);
system ("pause");
return 0;
}