1.斐波那契數列
①思路:這個題首先我們得明白斐波那契數列,
斐波那契數列是一組第一位和第二位為1,從第三位開始,后一位是前兩位和的一組遞增數列
例如:1 1 2 3 5 8 13.......這樣的數列,
觀察上面的數列我們不難發現斐波那契數列第三項開始,每一項都等于前兩項之和,
我們可以利用遞回函式來實作它,把0和1當做這個遞回的結束標志來完成這一系列操作
②代碼實作:
#include<stdio.h>
int F(int x)
{
if (x == 1 || x == 0)
return x;
else return (F(x - 1) + F(x - 2));
}//遞回數列
int main()
{
int a = 0;
scanf_s("%d", &a);
int b = F(a);
printf("斐波那契數列的第%d個數為:%d\n", a, b);
return 0;
}
2.求最大公約數和最小公倍數
①思路:首先我們需要明白什么是最大公約數還有最小公倍數,還有最大公約數的求法,
我個人運用了兩個適合遞回函式的方法來求這個最大公約數,分別是輾轉相除法和不斷相減法
輾轉相除法:就是兩個數相除然后余數跟最小的數相除,一直回圈直到余數等于零,最后一次回圈的除數就是最大公約數,就用30和18來舉例子吧,
30÷18=1...12,18÷12=1...6, 12÷6=0
所以30和18的最大公約數為6,這里得余數我們可以很容易利用%來解決,
不斷相減法:兩數最大的數減去最小的,然后結果在跟上一次最小的數比大小,繼續最大的減去最小的,直到兩個數相減為0,得出結果,繼續用30和18舉例子,
30>18 30-18=12,18>12 18-12=6, 12>6 12-6=6 ,6=6 6-6=0
因此30和18的最大公約數為6,跟上面的結果是一樣的,這里比大小我們可以利用三目運算子來實作,
②代碼如下:
#include<stdio.h>
int zxgbs(int a, int b)
{
int m = 0;
m = a % b;
return (m == 0) ? b : zxgbs(b, m);
}//最大公約數(輾轉相除)
//int zxgbs(int a, int b)
//{
// int t;
// a = (a >= b) ? a : b;
// b = (a >= b) ? b : a;//b最小值,a最大值
// t = a - b;
// return (t == 0) ? b : zxgbs(t, b);
//}//最大公約數(相減法)最大值減最小值然后遞回
int main()
{
int x, y;
printf("請輸入兩個數:\n");
scanf_s("%d %d", &x, &y);
int z = zxgbs(x, y);
printf("最大公約數為:%d\n 最小公倍數為:%d", z, (x * y) / z);
return 0;
}
3.輸入一個數求階乘
①思路:這個題就比較簡單了,一個數的階乘,一個正整數的階乘是所有小于及等于該數的正整數的積,并且0的階乘為1,例如5!=5×4×3×2×1=120
我們可以用遞回函式很容易實作它
②代碼如下:
#include<stdio.h>
int tese(int x)
{
if (x == 1 || x == 0)
return 1;
else return (tese(x - 1) * x);
}//階乘
int main()
{
int a = 0;
scanf_s("%d", &a);
int z = tese(a);
printf("%d", z);
return 0;
}
總結
以上是我最近學習遞回函式發現的一些典型關于這這方面的題,做了這些題我們不難發現遞回函式也是函式的一種,但是他的特殊點就在于可以一直呼叫一直呼叫,但是他必須要有一個結束陳述句來結束呼叫,每一次呼叫變數都會不同,并且每次呼叫結束都會回傳,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/397429.html
標籤:其他
