遞歸:
就是函數調用自己的程式設計技巧
人了解疊代,神了解遞歸。
遞歸的兩個必要條件
1、存在限制條件,當滿足這個條件時,遞歸便不再繼續。
2、每次遞歸調用之後越來越接近這個限制條件。
注:滿足這兩個條件的遞歸也不一定就完全正确,但是不滿足這兩條件一定錯誤!!!!
例題:1.遞歸和非遞歸分别實作求第n個斐波那契數。
(對于求斐波那契數此問來說,遞歸并不是最好的方法,原因是計算量太大!)
#include<stdio.h>
int fib(int n);
int main()
{
int n;
scanf("%d",&n);
int f = fib(n);
printf("%d",f);
return 0;
}
int fib(int n)
{
int b;
if (n <= 2)
return 1;
else
b = fib(n - 1) + fib(n - 2);
return b;
b--;
}
下面我們用循環試試
#include<stdio.h>
int fib(int n);
int main()
{
int n = 0;
scanf("%d", &n);
int f = fib(n);
printf("%d",f);
return 0;
}
int fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
例題2.編寫一個函數實作n^k,使用遞歸實作
#include<stdio.h>
int fun(int n, int k);
int main()
{
int n=0;
int k=0;
int c=0;
scanf("%d%d", &n, &k);
c = fun(n, k);
printf("%d",c);
return 0;
}
int fun(int n, int k)
{
if (k == 1)
return n;
return n * fun(n, k - 1);
}
例題3.寫一個遞歸函數DigitSum(n),輸入一個非負整數,傳回組成它的數字之和
例如,調用DigitSum(1729),則應該傳回1+7+2+9,它的和是19
#include<stdio.h>
int digitsum(int n);
int main()
{
int n;
scanf("%d",&n);
int c = digitsum(n);
printf("%d",c);
return 0;
}
int digitsum(int n)
{
if(n==0)
return n;
return n % 10 +digitsum(n / 10);
}
#include<stdio.h>
int len(char* a);
int main()
{
char a[] = "hello";
int c = len(a);
printf("%d", c);
return 0;
}
int len(char* n)//n是指向首元素位址的
{
if (*n != '\0')
return 1+len(n+1);//如果首元素不是\0則剝離一個1出來并使指針向後移動一位。
return 0;
}
#include<stdio.h>
void print(int n);
int main()
{
int n;
scanf("%d",&n);
print(n);
return 0;
}
void print(int n)
{
if (n == 0)
return;
print(n / 10);
printf("%d\n", n % 10);
}