递归即程序调用自身的编程技巧。在程序设计语言中广泛应用。一般用于解决三类问题:1.数据的定义是按递归定义的。(比如斐波那契数列)2.问题解法按递归算法实现。(汉诺塔)3.数据的结构形式是按递归定义的。
我第一次敲递归便是斐波那契数列。向学长讨教过后,写出代码如下:
#include<stdio.h>
int Fibon1(int n) { //定义一个斐波那契数列函数
if (n == 1 || n == 2) {
return 1; } //出口
else {
return Fibon1(n - 1) + Fibon1(n - 2); } //自己调用自己
}
int main() {
int n ;
int ret = 0;
scanf("%d", &n);
ret = Fibon1(n);
printf("ret=%d", ret);
return 0;
}
斐波那契数列又称黄金分割数列。指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。
斐波那契数列很符合递归一般应用的第一类问题,即数据的定义就是按递归定义。写完基本的主函数后,定义一个斐波那契数列函数,规定出口,然后写递归关系并进行调用。用递归写斐波那契数列极大地简化了程序,为了对照,我还用for循环写了斐波那契数列。由于主函数部分都相同,于是这里只给出了子函数部分。
int Fibonacci(int n){
int i,num=1, sum=1, tmp=0;
if (n <= 2)
return 1;
else
for (i = 3; i <= n ; i++) {
tmp = num + sum;
num = sum;
sum = tmp;
}
return sum;
}
用for循环写出的斐波那契数列程序编码相对较多,并且相对递归较复杂。而递归将问题细化解决,使用更为简便。要写递归函数,最主要的是找准递归关系和出口,其中,如何准确运用递归关系自己调用自己是学会写递归函数的精髓。
依旧是以斐波那契数列为例,出口为当n<=2时返回1,依据斐波那契数列的函数式F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),可写 Fibon1(n - 1) + Fibon1(n - 2)作为返回值,实现递归的自己调用自己。
我初学递归时,很难把握递归关系并用编程语言的形式写出来,经过自己课后观看线上视频和向学长学姐们的请教,对递归的了解加深了许多,学C语言的过程中有苦有乐,从一窍不通的小白到现在的基本掌握,有敲代码到深夜的难以入眠,也有为一个代码困扰几天而不得解的烦恼,越到后来,学的内容越来越难,敲一个代码所需的时间也就越长,常常两三个小时才能搞懂一个代码。但是学习编程所需要的正是时间和经历所堆积的经验和熟练。练的越多就会越熟练,思维也会越开阔。斐波那契数列是我接触的第一个递归编程,也是印象最深的一个,因为它为我打开了递归的新大门,让我接触到了递归。