递归

来源:互联网 发布:为什么酷狗显示没网络 编辑:程序博客网 时间:2024/06/11 09:01
1.编写一个函数实现n^k,使用递归实现 
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double caculateChange(int a, int b)
{
double  ret = 0;
int ab = 0;
if (b== 0)
{
ret = 1;
}
else if (b > 0)
{
ret = a* caculateChange(a, --b);
}
else if (b < 0)
{
ab = abs(b);
ret =1.0000/( a* caculateChange(a, --ab));
}
return ret;
}
int main()
{
int n, k;
printf("请输入底数和指数:");
scanf("%d%d", &n, &k);
printf("计算结果是:%lf",caculateChange(n, k));
printf("\n");
system("pause");
}

2. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int DigitSum(int n)
{
int sum = 0;
if (n>0)
{
sum = sum + DigitSum(n / 10);
sum = sum + n % 10;
}
else
{
printf("请输入一个非负整数:\n");
}
return sum;
}
int main()
{
int num;
printf("请输入一个非负整数:\n");
scanf("%d", &num);
printf("%d返回%d", num, DigitSum(num));
system("pause");
}

3. 编写一个函数reverse_string(char * string)(递归实现) 
实现:将参数字符串中的字符反向排列。 

要求:不能使用C函数库中的字符串操作函数。

方法1:

 #define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<Assert.h>
void reverse_string(char * string)
{
if (*string == '\0')
printf("%c", *string);
else
{
reverse_string(++string);  //输出下一个字符  
printf("%c", *(--string));  //因为string已经执行完++,所以若要输出当前字符得--  
}
printf("\n");
}
int main()
{
char str[] = { 0 };
printf("请输入字符:\n");
scanf("%s", str);
printf("反向排序为:\n");
reverse_string(str);
system("pause");
return 0;
}

方法2:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<Assert.h>
void reverse_string(char * string,int len)
{
assert(string);
int left = 0;
int right =len - 1;
char temp = 0;
while (left < right)
{
temp = string[left];
string[left] = string[right];
string[right] = temp;
left++;
right--;
}
printf("%s", string);
}
int  mystrlen(char *string)
{
assert(string);
if (*string == 0)
{
return 0;
}
else
{
return 1 + mystrlen(string + 1);
}
}
int main()
{
char str[] = { 0 };
printf("请输入字符:\n");
scanf("%s", str);
printf("反向排序为:\n");
int len = 0;
len = mystrlen(str);
reverse_string(str,len);
system("pause");
return 0;
}
方法3:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<Assert.h>
char * reverse_string(char *p)
{
int n = 0;
char temp;
char *q;
//用q保存开始的p  
q = p;
//计算出字符串的大小  
while (*p != 0)
{
n++;
p++;
}
//保存第一个字符到一个变量中,  
//最后一个放到第一个的位置,  
//最后一个位置放'\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 main()

{
char p[] = { 0 };
printf("请输入字符:\n");
scanf("%s", p);
printf("原字符串是:%s\n", p);
printf("翻转后的字符串是:%s\n", reverse_string(p));
system("pause");
return 0;
}


4.不创建临时变量求字符串长度。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<Assert.h>
int My_strlen(char *string)
{
assert(string);
if(*string == '\0')
{
return 0;
}
else
{
return 1+My_strlen(string+1);
}
}
void main()
{
char arr[] = { 0 };
printf("请输入字符串:\n");
scanf("%s",arr);
printf("长度是%d",  My_strlen(arr));
system("pause");

5.递归和非递归实现求n的阶乘 

递归法:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int fun(int n)
{

if (n == 0||n == 1)
{
return 1;
}
else if (n>1)
{
return n*fun(n-1);
}
return 0;
}
int main()
{
int num;
printf("请输入数字\n");
scanf("%d", &num);
printf("%d的阶乘是%d\n", num, fun(num));
system("pause");
return 0;
}

非递归法:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Digui(int n)
{
int ret = 1;
if (n == 0 || n == 1)
{
ret = 1;
}
else if (n > 1)
{
for (int i = 2; i <= n; i++)
{
ret = ret*i;
}
}
return ret;
}
int main()
{
int num;
printf("请输入数字\n");
scanf("%d", &num);
printf("%d的阶乘是%d\n", num, Digui(num));
system("pause");
return 0;
}

6.递归和非递归实现求第n个斐波那契数。

递归方法: 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Feibonacci(int n)
{
if (n == 1 || n == 2)
{
return  1;
}
else if (n>2)
{
return (Feibonacci(n - 1) + Feibonacci(n - 2));
}
}
int main()
{
int num;
printf("请输入一个大于0的整数数字\n");
scanf("%d", &num);
printf("第%d个斐波那契数%d\n", num, Feibonacci(num));
system("pause");
return 0;
}

非递归方法:

//非递归
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Feibona(int n)
{
int ret = 0;
int f1 = 1;
int f2 = 1;
if (n == 1 || n == 2)
{
ret = 1;
}
else
{
for (int i = 1; i <= n - 2; i++)
{
ret = f1 + f2;
f1 = f2;
f2 = ret;
}
}

return ret;
}
int main()
{
int num;
printf("请输入一个大于0的整数数字\n");
scanf("%d", &num);
printf("第%d个斐波那契数%d\n", num, Feibona(num));
system("pause");
return 0;
}

原创粉丝点击