1.递归和非递归分别实现求第n个斐波那契数。
#include<stdio.h>
int fib(int n)
{
if(n<0) //考虑n小于0;
{
return 0;
}
else
{
if(n==1)
return 1;
else if(n==2)
return 1;
else
return fib(n-1)+fib(n-2); //青蛙跳台阶问题是一样的解法 (只跳一节或两节台阶)
} //可以跳n节台阶 是2*fib(n-1)
}
int main()
{
int num = 0;
int ret = 0;
scanf("%d",&num);
ret = fib(num);
printf("%d",ret);
return 0;
}
#include<stdio.h>
int fib(int n)
{
int f1 =1;
int f2 = 1;
int f3 = 0;
int a = n-2;
if(n<0)
{
return 0;
}
if((n==1)||(n==2))
return 1;
while(a--)
{
f3 = f1+f2;
f1 = f2;
f2 = f3;
}
return f3;
}
int main()
{
int num = 0;
scanf("%d",&num);
int ret = 0;
ret = fib(num);
printf("%d",ret);
return 0;
}
2.编写一个函数实现n^k,使用递归实现
#include<stdio.h>
double cifang(int n , int k)
{
if(k==0)
return 1;
if(k>0) //k是大于0的,小于0的话,容易溢出
{
if(k==1)
return n;
else
{
return n*cifang(n,k-1);
}
}
return 0;
}
int main()
{
int num = 0;
int k = 0;
double ret = 0.0;
scanf("%d %d",&num,&k);
ret = cifang(num,k);
printf("num = %lf\n",ret);
return 0;
}
3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#include<stdio.h>
int sum(int num)
{
if(num>0)
{
if((num/10)==0)
return num;
else
return (num%10+sum(num/10));
}
return 0;
}
int main()
{
int num = 0;
int ret = 0;
scanf("%d",&num);
ret = sum(num);
printf("%d\n",ret);
return 0;
}
4. 编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中
的字符串操作函数。
第一种不用递归方法:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stddef.h>
int my_strlen(char const *str)
{
assert(str!=NULL);
int count = 0;
while(*str++)
{
count++;
}
return count ;
}
char* reverse(char *str)
{
char *p1 = str;
char *p2 = NULL;
char tmp = 0;
p2 = str+my_strlen(str)-1;
while(p1<p2)
while(p1<p2)
{
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2--;
}
return str;
}
int main()
{
char *ret = NULL;
char str[] = "abcdef"; //注意不能是字符串常量,他是不能改的如 char *str = "abcdef";
ret = reverse(str);
printf("%s\n",ret);
return 0;
}
第二种用递归:
int my_strlen(char const *str)
{
if((*str)=='\0')
return 0;
else
return 1+my_strlen(str+1);
}
void reverse(char *str)
{
int len = my_strlen(str);
assert(str!=NULL);
if(len<=1)
return ;
else
{
char tmp = 0;
tmp = str[0];
str[0] = str[len-1];
str[len-1] = '\0';
reverse(str+1);
str[len-1] = tmp;
}
}
int main()
{
char str[] = "abcdef";
reverse(str);
printf("%s\n",str);
system("pause");
return 0;
}
5.递归方式实现打印一个整数的每一位
void print(int a)
{
if(a==0)
return;
print(a/10);
printf("%d",a%10);
}
int main()
{
int a = 1234;
print(a);
system("pause");
return 0;
}