第十九篇 -- 研究下函数(二) —— 递归函数
如果一个函数在其定义中又调用自身,则称为递归函数,调用自身的过程叫做递归。递归分为直接递归和间接递归。直接递归是指函数直接调用自身,间接递归则指A函数调用了B函数,而B函数又调用了A函数。函数递归应当有个终止条件,即当某个条件满足时,递归就应当停止。否则没完没了地继续下去,程序就会陷入死循环。
有些问题本身就是用递归定义的,适合用递归函数来解决。典型的问题如Fibonacci数列:
1, 1, 2, 3, 5, 8, 13, 21, ...
在这个数列中,第1和第2个数都是1。其后的每一个数,都是这个数前面两个数的和,例如,第3个数2 = 1 + 1,第4个数3 = 1 + 2,第8个数21 = 8 + 13.
如果要求第n个数,则首先应当求出第n-2和第n-1个数。为了求第n-2和第n-1个数,又需要求第n-4和第n-3个数。。。如此类推下去,直至第1和第2个数,而这两个数是已知的,递归到此终止。递归终止以后,就开始“反递归”,即根据递归终止时求得的值,一步步返回去,求得目标值。
说明:程序员编程时只要编写递归过程,反递归过程则由编译器负责完成。
// Fibonacci_study.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include "pch.h" #include <iostream> using namespace std; int Fibonacci(int n); int main() { cout << "Fibonacci数列中的第n个数: " << endl; int n = 0; //变量n cout << "请输入n:"; cin >> n; while (0 < n) { cout << "F(" << n << ") == " << Fibonacci(n) << endl << endl; cout << "请输入n:"; cin >> n; } cout << "Hello World!\n"; return 0; } int Fibonacci(int n) { if (1 == n || 2 == n) { return 1; } return Fibonacci(n - 1) + Fibonacci(n - 2); }
在Fibonacci函数的定义中,“1==n||2==n”就是递归终止条件。如果这个条件不满足,则按照Fibonacci的定义F(n) = F(n-1) + F(n-2)进行递归求解。
当心:虽然递归在解决某些问题方面非常方便,但也是有代价的。每次递归调用都要重新创建一份函数的副本。如果函数中有大量的变量,并且递归层次很多,则内存很快就会被消耗殆尽。因此,应用递归时,函数应当尽量简单,而且要尽量减少递归的层次。