1.递归和非递归分别实现求第n个斐波那契数。
这个应该都会,简单的递归.
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int Fib(int n)
{
if(n==1||n==2)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
int main()
{
int n;
cin>>n;
Fib(n);
printf("%d\n",Fib(n));
return 0;
}
非递归主要就是以下方法,其实还有一种方法也就是数组的方法.
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int Fib(int n)
{
if(n==1||n==2)
return 1;
int f1=1;
int f2=1;
int fn=0;
for(int i=2;i<n;i++)
{
fn=f1+f2;
f1=f2;
f2=fn;
}
return fn;
}
int main()
{
int n;
cin>>n;
Fib(n);
printf("%d\n",Fib(n));
return 0;
}
2.编写一个函数实现n^k,使用递归实现.
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int ncf(int n,int k)
{
if(n==1||k==0)
return 1;
else
return n*(pow(n,k-1));
}
int main()
{
int n,k;
cin>>n>>k;
ncf(n,k);
printf("%d\n",ncf(n,k));
return 0;
}
3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19.
其实就是求出输入的数的每位数是多少.
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int Digitsum(int n)
{
//输入一个非负整数,返回组成它的数字之和如1729
//返回的是1+7+2+9;
if(n<10)
return n;
else
return n%10+Digitsum(n/10);
}
int main()
{
int n;
cin>>n;
Digitsum(n);
printf("%d\n",Digitsum(n));
return 0;
}
这个其实我做的时候是不会的,我一直在想不同的数位数不同的话它的处理方法也是不同的,但其实我想的有点多了.主要是 return n%10+Digitsum(n/10),如123%10=3,接下来123/10=12;12%10=2;12/10=1;这样就把每一位数的个十百位数算出来了.
4. 编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
//编写一个函数 reverse_string(char * string)(递归实现)
//实现:将参数字符串中的字符反向排列。
//要求:不能使用C函数库中的字符串操作函数
void reverse_string(char* string)
{
if(*(++string)!='\0')
reverse_string(string);
printf("%c",*(string-1));
}
int main()
{
char string[100]="acbedfg";
reverse_string(string);
printf("\n");
return 0;
}
主要是指针的应用,以及指针和字符串的结合应用.
5.递归和非递归分别实现strlen
递归算法:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int my_strlen(char* string)
{
int cnt=0;
if(*string!='\0')
{
string++;
cnt=1+my_strlen(string);
}
return cnt;
}
int main()
{
char string[50]="abcdef";
my_strlen(string);
printf("%d\n",my_strlen(string));
return 0;
}
非递归算法:
6.递归和非递归分别实现求n的阶乘
递归的方法:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int factorial(int n)
{
if(n<=1)
return 1;
else
return n*factorial(n-1);
}
int main()
{
int n;
cin>>n;
factorial(n);
printf("%d\n",factorial(n));
return 0;
}
非递归的方法:使用迭代法计算n的阶乘.
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,ans=1;
cin>>n;
for(int i=1;i<=n;i++)
ans=ans*i;
printf("%d\n",ans);
}
7.递归方式实现打印一个整数的每一位
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
void number_cnt(int n)
{
//递归方式实现打印一个整数的每一位
if(n>9)
{
number_cnt(n/10);
}
printf("%d ",n%10);
}
int main()
{
int n;
cin>>n;
number_cnt(n);
printf("\n");
return 0;
}
记住不要手贱,if后面不要多加else.