递归
来源:互联网 发布:为什么酷狗显示没网络 编辑:程序博客网 时间:2024/06/11 09:01
#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");
}
实现:将参数字符串中的字符反向排列。
要求:不能使用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;
}
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- 递归
- java并发编程——阻塞队列与非阻塞队列
- 第一次深入学习AD遇到的一些问题
- ES6(ECMAScript 6)学习笔记
- 20170727 JAVA练习题:抽奖
- elasticsearch5.0.1集群索引分片丢失的处理
- 递归
- python常见易错面试题
- 简单c++日志类
- poj 3414 Pots(BFS)(简单题)
- ionic中AlertController设置
- main函数的返回值问题
- [libkcp] Abstract
- 同余定理
- 无线轮播+GET网络请求数据+xlistview+多条目加载