C_关于递归算法的几个例子

1.递归算法的定义:

 

2.递归与迭代的优劣

 

eg1:斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

 1 /*
 2     斐波那契数列 迭代实现        (打印出前40个)
 3 */
 4 #include <stdio.h>
 5 int main(){
 6     int i, arr[40];
 7     arr[0] = 0;
 8     arr[1] = 1;
 9     printf("%d %d ",arr[0],arr[1]);
10     for(i=2; i<40; i++){
11         arr[i] = arr[i-1] + arr[i-2];
12         printf("%d ",arr[i]);
13     }
14     printf("\n");
15 
16     return 0;
17 
18 }
 1 /*
 2     斐波那契数列 递归实现    (打印出前40个)
 3 */
 4 #include <stdio.h>
 5 /*
 6 int fb(int n){
 7     if(n == 0){
 8         return 0;
 9     }else if(n == 1){
10         return 1;
11     }else{
12         return fb(n-1) + fb(n-2);
13     }
14 }
15 */
16 
17 int fb(int n){
18     if(n<2){
19         return n == 0? 0:1;
20     }else{
21         return fb(n-1) + fb (n-2);
22     }
23     
24 }
25 
26 
27 int main(){
28     int i;
29     for(i=0; i<40; i++){
30         printf("%d ",fb(i));
31     }
32     printf("\n");
33     
34     return 0;
35 }

 

eg2:阶乘:亦即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

 1 /*
 2     递归实现阶乘
 3     递归方式定义:0!=1,n!=(n-1)!×n。
 4 */
 5 
 6 #include <stdio.h>
 7 int fact(n){
 8     if(n == 0){
 9         return 1;
10     }else{
11         return fact(n-1) * n;
12     }
13 }
14 
15 int main(){
16     int n = 5;
17     printf("%d\n",fact(n));
18     return 0;
19 }

 

eg3:

 1 #include <stdio.h>
 2 int print(){
 3     char a;
 4     scanf("%c", &a);
 5     if(a != '#'){
 6         print();
 7     }
 8     if(a != '#'){
 9         printf("%c",a);
10     }
11     return 0;
12 }
13 int main(){
14     print();
15     printf("\n");
16     return 0;
17 }

解题思路:

 

eg4:二分法查找

 1 /*
 2     二分法查找:迭代实现
 3 */
 4 #include <stdio.h>
 5 int main(){
 6     int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 7     int input, low, high, mid;
 8     low = 0;
 9     high = 9;
10     mid = (low + high) / 2;
11     scanf("%d", &input);
12 
13     while(input != arr[mid]){
14         if(input < arr[mid]){
15             high = mid;
16             mid = (low + high) / 2;
17         }else{
18             low = mid;
19             mid = (low + high) / 2;
20         }
21     }
22     printf("%d ",mid);/*输出要查找数字在数组中的下标*/
23     return 0;
24     
25 }
 1 /*
 2     二分法查找:递归实现
 3 */
 4 
 5 #include <stdio.h>
 6 int fun(int low, int high, int input, int arr[]){
 7     int mid;
 8     mid = (low + high) /2;
 9     if(arr[mid] == input){
10         return mid;
11     }else{
12         if(input < arr[mid]){
13             high = mid;
14             return fun( low, high, input, arr);
15         }else{
16             low = mid;
17             return fun( low, high, input, arr);
18         }
19     }
20 
21 }
22 int main(){
23     int arr[10] = {1,2,3,4,5,6,7,8,9,10};
24     int input, low, high;
25     low = 0;
26     high = 9;
27     scanf("%d", &input);
28     printf("%d \n",fun(low, high, input, arr));/*输出要查找数字在数组中的下标*/
29     return 0;
30 }

 

posted @ 2017-08-19 14:30  忍冬。  阅读(478)  评论(0编辑  收藏  举报