算法很美 笔记 2.递归与算法分析

本文提供最大公倍数、字符串反转、递归形式插入排序及汉诺塔问题的算法实现,涵盖数学运算、字符串操作、排序算法及递归思维。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最大公倍数

样例输入:

5 15

样例输出:

5

样例输入:

7 2

样例输出:

1

AC

#include <stdio.h>

int gcd(int n, int m) {
	return m == 0 ? n : gcd(m, n % m);
}


int main() {
	int n, m;
	scanf("%d %d", &n, &m);
	printf("%d\n", gcd(n, m));
}

字符串反转

输入

abcd

输出

dcba

AC

#include <stdio.h>

void Rever() {
	char s;
	scanf("%c", &s); //输入a,然后跳转递归,输入b
	if (s != '\n') {
		Rever();
		printf("%c", s);
	}
	return;

}

int main() {
	Rever();
	return 0;
}

递归形式插入排序

问题描述

对数组0~倒数第一个排序等价于:
对数组的0~倒数第二个元素,这部分排序
然后把是后一个元素插入到这个有序的部分中

AC

#include <stdio.h>
#include <malloc.h>


void InsertSort(int *&arr, int N) {
	if (N == 0) //跳出条件
		return;
	InsertSort(arr, N - 1);  //缩小问题规模
	int x = arr[N]; //当前数组值
	int index = N - 1;  //前一个数组下标
	while (index > -1 && x < arr[index]) {
		arr[index + 1] = arr[index]; //往后挪位置
		index--;
	}
	arr[index + 1] = x;

}
/*
void Insert(int *arr, int N) { // 法2
	int t;
	if (N == 0)
		return;
	Insert(arr, N - 1);
	while (N > 0) { 
		if (arr[N] < arr[N - 1]) {
			t = arr[N - 1];
			arr[N - 1] = arr[N];
			arr[N] = t;
		}
		N--;

	}
	return;
}
*/

//while (n > 0 && arr[n] < arr[n - 1])
//不能这个写,会造成短路



int main() {
	int *arr, N;
	scanf("%d", &N);
	arr = (int *)malloc(sizeof(int) * N);

	for (int i = 0; i < N; i++)
		scanf("%d", &arr[i]);
	InsertSort(arr, N - 1);  // !!! N个数,N-1次挪动

	for (int i = 0; i < N; i++)
		printf("%d", arr[i]);
	printf("\n");


}

汉诺塔

问题描述:

从左到右 A B C 柱 大盘子在下, 小盘子在上,
借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 
大盘子只能在小盘子的下面.

输入

圆盘个数
输出
圆盘移动过程

算法思想

利用栈理解递归

AC

#include <iostream>
using namespace std;
void Hanoi(int n, char x, char y, char z);

int main()
{
	int n;
	cout << "Please input num:";
	cin >> n;
	Hanoi(n, 'A', 'B', 'C');
	return 0;
}

void Hanoi(int n, char A, char B, char C)  //注意传入参数顺序的改变
{
	if(n == 1) //结束条件只剩一个圆盘
		cout << "no." << n << " from " << A << " to " << C << endl;   //将第n个盘子从A移至C
	else
	{
		Hanoi(n - 1, A, C, B); //将n-1个s盘子从A到B,借助C
		cout << "no." << n << " from " << A << " to " << C << endl;  //将第n个盘子从A移至C
		Hanoi(n - 1, B, A, C);  //将n-1个盘子从B到C,借助A
	}
}

### Windows 11 中将 D 空间分配给 C 方法 #### 使用内置工具 Disk Management 进行分区调整 在 Windows 11磁盘管理工具中可以直接对硬分区进行修改。然而,当尝试直接扩展 C 时可能会发现选项处于不可用状态,这是因为要扩展的目标卷旁边没有足够的连续未分配空间[^1]。 为了实现这一目标,可以按照如下方式操作: - **准备阶段** 确保重要数据已备份以防意外丢失。打开命令提示符(管理员权限),通过 `diskpart` 命令启动磁盘分割实用程序,并执行相应指令来查看当前磁盘布局以及是否有可用于扩展的自由空间。 ```batch DISKPART> list disk DISKPART> select disk 0 DISKPART> list partition ``` - **创建未分配空间** 对于希望从中获取额外空间的逻辑驱动器(如 D:\),可以通过图形界面中的“压缩卷”功能释放一部分容量作为未分配区域。需要注意的是,新产生的未分配空间应当紧邻着打算扩增的那个主分区(即 C:\)以便后续能够顺利合并两者之间的边界[^5]。 如果两者的相对位置并不满足上述条件,则可能需要先移动某些现有分区的位置以腾出适当的空间用于连接两个待组合的部分。不过这项工作通常较为复杂且风险较大,建议采用专业的第三方软件辅助完成[^4]。 - **应用 Partition Assistant 或 类似工具** 考虑到实际应用场景下的局限性潜在的风险因素,在面对复杂的多分区结构时推荐借助可靠的第三方应用程序来进行更精细的操作。这类工具往往提供了更加直观易懂的人机交互流程指导用户逐步达成目的而不必担心误触关键设置造成不必要的麻烦。 例如,“Partition Assistant Standard Edition” 是一款免费但功能强大的解决方案之一,支持多种常见的磁盘重组需求,包括但不限于本案例所描述的情形。只需简单几步即可安全有效地转移所需资源至系统所在分区从而缓解其存储压力的同时保持整体系统的稳定性与可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值