遞迴和非遞迴的簡單常見問題
阿新 • • 發佈:2018-12-17
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.