8 递归
8.1 简介
递归就是函数自己调用自己(C++不允许main函数自己调用自己)。
格式:
void recurs(argumentlist)
{
statements1
if (test)
recurs(arguments)
statements2
}
8.2 包含一个递归调用的递归
8.2.1 代码
one_recursion.h
#pragma once
#ifndef _ONE_RECURSION_H
#define _ONE_RECURSION_H
#include <iostream>
using std::cout;
void countdown(int n)
{
using namespace std;
cout << "Counting down ... " << n << " (n at " << &n << ")" << endl;
if (n > 0)
countdown(n - 1); // function calls itself
cout << n << ": Kaboom!" << " (n at " << &n << ")" << endl;
}
#endif
main.cpp
/*
Project name : _35Recursion
Last modified Date: 2022年5月7日17点31分
Last Version: V1.0
Descriptions: 递归
*/
#include "one_recursion.h"
int main()
{
using std::cout;
using std::endl;
cout << "包含一个递归调用的递归******************************" << endl;
countdown(4); // call the recursive function
return 0;
}
8.2.2 运行结果
包含一个递归调用的递归******************************
Counting down ... 4 (n at 00000075612FFC50)
Counting down ... 3 (n at 00000075612FFB50)
Counting down ... 2 (n at 00000075612FFA50)
Counting down ... 1 (n at 00000075612FF950)
Counting down ... 0 (n at 00000075612FF850)
0: Kaboom! (n at 00000075612FF850)
1: Kaboom! (n at 00000075612FF950)
2: Kaboom! (n at 00000075612FFA50)
3: Kaboom! (n at 00000075612FFB50)
4: Kaboom! (n at 00000075612FFC50)
D:\Prj\_C++Self\_35Recursion\x64\Debug\_35Recursion.exe (进程 11596)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
8.3 包含多个递归调用的递归
8.3.1 代码
multi_recursion.h
#pragma once
#ifndef _MULTI_RECURSION_H
#define _MULTI_RECURSION_H
#include <iostream>
using std::cout;
const int Len = 66;
const int Divs = 6;
void subdivide(char ar[], int low, int high, int level)
{
if (level == 0)
return;
int mid = (high + low) / 2;
ar[mid] = '|';
subdivide(ar, low, mid, level - 1);
subdivide(ar, mid, high, level - 1);
}
void Multi_Recursion(void)
{
char ruler[Len];
int i;
for (i = 1; i < Len - 2; i++)
ruler[i] = ' ';
ruler[Len - 1] = '\0';
int max = Len - 2;
int min = 0;
ruler[min] = ruler[max] = '|';
std::cout << ruler << std::endl;
for (i = 1; i <= Divs; i++)
{
subdivide(ruler, min, max, i);
std::cout << ruler << std::endl;
for (int j = 1; j < Len - 2; j++)
ruler[j] = ' '; // reset to blank ruler
}
}
#endif
main.cpp
/*
Project name : _35Recursion
Last modified Date: 2022年5月7日17点31分
Last Version: V1.0
Descriptions: 递归
*/
#include "multi_recursion.h"
int main()
{
using std::cout;
using std::endl;
cout << "包含多个递归调用的递归******************************" << endl;
Multi_Recursion();
return 0;
}
8.3.2 运行结果
包含多个递归调用的递归******************************
| |
| | |
| | | | |
| | | | | | | | |
| | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
D:\Prj\_C++Self\_35Recursion\x64\Debug\_35Recursion.exe (进程 11596)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
README
此为本人读C++ Primer总结的笔记,如有错误或知识缺口,请在评论区告知。如本文有在实践中帮到您,是本人的荣幸。