1、递归和非递归分别实现求第n个斐波那契数。
2、编写一个函数实现n^k,使用递归实现
3、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
4、 编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中
的字符串操作函数。
5、递归和非递归分别实现strlen
6、递归和非递归分别实现求n的阶乘
7、递归方式实现打印一个整数的每一位
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
int fib1(int n)//递归求斐波那契数
{
if(n <= 2)
return 1;
else
return fib1(n-1) + fib1(n-2);
}
int fib2(int n)//非递归求斐波那契数
{
int a = 1;
int b = 1;
int sum = b;
while(n>2)
{
sum = a + b;
a = b;
b = sum;
n-- ;
}
return sum;
}
int Cifang1(int n, int k)//递归求n的k次方
{
if(k == 0)
return 1;
else
return n*Cifang1(n,k-1);
}
int Cifang2(int n, int k)//非递归求n的k次方
{
int sum = 1;
if(k == 0)
return 1;
else
{
while(k--)
{
sum = sum*n;
}
return sum;
}
}
int DigitSum1(int n)//递归求一个非负整数组成它的数字之和
{
if(n < 10)
return n;
else
return n%10 + DigitSum1(n/10);
}
int DigitSum2(int n)//非递归求一个非负整数组成它的数字之和
{
int sum = 0;
while(n)
{
if(n<10)
{
sum = sum +n;
break;
}
else
{
sum = sum + n%10;
n = n/10;
}
}
return sum;
}
char *reverse_string(char * string)//递归将参数字符串中的字符反向排列
{
int n = 0;
char temp;
char *q;
assert(string != NULL);
q = string;//用q保存开始的p
while( *string != 0 )//计算出字符串的大小
{
n++;
string++;
}
//保存第一个字符到一个变量中,
//最后一个放到第一个的位置,
//最后一个位置放'\0',以此类推
if( n > 1)
{
temp = q[0];
q[0] = q[n-1];
q[n - 1] = '\0';
reverse_string( q+1 );
q[n - 1] = temp;
}
return q;
}
int my_strlen1(const char *q)//递归实现strlen函数
{
assert(q != NULL);
if(*q == '\0')
return 0;
else
return 1 + my_strlen1(q+1);
}
int my_strlen2(char *q)//非递归实现strlen函数
{
char *ret = q;
assert(q != NULL);
while(*q != '\0')
q++;
return q-ret;
}
int factorial1(int n)//递归实现n的阶乘
{
if(n == 1)
return 1;
else
return n * factorial1(n-1);
}
int factorial2(int n)//非递归实现n的阶乘
{
int sum = 1;
while(n > 1)
{
sum = sum * n;
n--;
}
return sum;
}
void print(int n)//递归打印一个整数的每一位
{
if(n > 9)
{
print(n/10);
printf("%d",n%10);
}
else
printf("%d",n);
}
int main()
{
int k = 0;
int n = 0;
int ret = 0;
char arr[] = "abcdefg";
printf("请输入数字\n");
scanf("%d",&n);
ret = fib1(n);
printf("%d\n",ret);
printf("请输入数字\n");
scanf("%d%d",&n,&k);
ret = Cifang1(n,k);
printf("%d\n",ret);
printf("请输入数字\n");
scanf("%d",&n);
ret = DigitSum1(n);
printf("%d\n",ret);
printf("%s", reverse_string(arr));
printf("\n");
ret = my_strlen1(arr);
printf("%d\n",ret);
printf("请输入数字\n");
scanf("%d",&n);
ret = factorial1(n);
printf("%d\n",ret);
printf("请输入数字\n");
scanf("%d",&n);
print(n);
printf("\n");
return 0;
}