递归是一种在函数定义中使用的编程概念,它意味着函数可以调用自身。递归函数必须有一个基本条件(或者说终止条件),在这个条件下的递归调用将会停止。如果没有这个终止条件,递归将会无限进行下去,最终导致程序崩溃。
在编程中,递归通常用于解决可以分解为更小、更简单子问题的问题。递归函数会将一个大问题分解成更小的子问题,然后调用自身来解决这些子问题。
计算阶乘的C++代码示例:
在这个例子中,factorial()
函数是一个递归函数。当 n
等于0时,函数返回1,这是递归的终止条件。否则,函数会递归调用自身,计算 n
的阶乘。每次递归调用都会将 n
减1,直到 n
等于0为止。
#include <iostream>
int factorial(int n) {
if (n == 0) { // 终止条件
return 1;
} else { // 递归调用
return n * factorial(n - 1);
}
}
int main() {
int n;
std::cout << "请输入一个正整数:";
std::cin >> n;
std::cout << n << "的阶乘是:" << factorial(n) << std::endl;
return 0;
}
使用C++实现斐波那契数列的代码:
在这个程序中,我们定义了一个递归函数 fibonacci
来计算斐波那契数列的每一项。如果 n
小于或等于1,函数直接返回 n
。否则,函数递归调用 fibonacci(n-1)
和 fibonacci(n-2)
来计算下一项,然后将这两个值相加得到下一项的值。在 main
函数中,我们首先输入要计算的斐波那契数列的项数,然后使用一个循环遍历每一项并输出它们。
#include <iostream>
int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
int main() {
int n;
std::cout << "请输入要计算的斐波那契数列的项数:";
std::cin >> n;
std::cout << "斐波那契数列的前" << n << "项为:" << std::endl;
for (int i = 0; i < n; i++) {
std::cout << fibonacci(i) << " ";
}
std::cout << std::endl;
return 0;
}
使用递归方式输出星号的C++程序:
#include <iostream>
void printStars(int n) {
if (n == 0) { // 递归终止条件
return;
}
std::cout << "*"; // 输出一个星号
printStars(n - 1); // 递归调用函数
}
int main() {
int n;
std::cout << "请输入要输出的星号行数:";
std::cin >> n;
printStars(n);
return 0;
}
在上面的程序中,printStars()
函数使用递归方式输出指定行数的星号。当 n
等于0时,递归终止。否则,程序输出一个星号并递归调用 printStars()
函数,每次将 n
减1,直到 n
等于0为止。在 main()
函数中,程序从标准输入读取要输出的星号行数,并调用 printStars()
函数输出指定行数的星号。
求解杨辉三角形
此类问题求解可以从图1过渡到图2。图2是图1每个数字后面多了个空格,每行前面多了个空格。
经图片右侧分析可以看出。递归函数和终止条件。i为行,j为列。递归函数中使用n为行,m为列。
如下图1所示。是简单的杨辉三角形图例。
图1程序求解。程序如下:
#include <iostream>
using namespace std;
int y(int n,int m)
{
if(m==1||m==n){
return 1;
}
return y(n-1,m-1)+y(n-1,m);
}
int main() {
int m, n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cout<<y(i,j)<<" ";
}
cout<<"\n";
}
return 0;
}
输入5。运行结果:
如图2所示。是复杂的杨辉三角形图例。
程序如下:
#include <bits/stdc++.h>
using namespace std;
int y(int n,int m)
{
if(m==1||m==n){
return 1;
}
return y(n-1,m-1)+y(n-1,m);
}
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int k=n-i;k>=1;k--){
cout<<" ";
}
for(int j=1;j<=i;j++){
cout<<setw(5)<<y(i,j)<<" ";
}
cout<<"\n";
}
return 0;
}
输入20。运行结果: