【算法笔记题解】《算法笔记知识点记录》第四章——算法初步3——递归

简介: 【算法笔记题解】《算法笔记知识点记录》第四章——算法初步3——递归

全文目录

🍕4.3小节——算法初步->递归

问题 A: 吃糖果

问题 B: 数列

问题 C: 神奇的口袋

问题 D: 八皇后

🍕4.3小节——算法初步->递归

地址合集:《算法笔记》4.3小节——算法初步->递归


问题 A: 吃糖果

斐波那契数列的变种题i形,直接写就好了。


#include <cstdio>
int F(int n){
    if(n == 0 || n == 1)    return 1;
    return F(n - 1) + F(n - 2);
}
int main(){
    int n;
    while(scanf("%d", &n) != EOF){
        printf("%d\n",F(n));
    }
    return 0;
}


问题 B: 数列

不能每次都算这个东西,所以利用了非递归的写法,直接存数组了。


#include <cstdio>
int F[20];
int main(){
    F[0] = 0, F[1] = 1;
    for(int i = 2;i < 20; i++)
        F[i] = F[i-1] + F[i-2]; //先打个表0.0
    int m,n;
    if(scanf("%d", &m) != EOF){
        while(m--){
            if(scanf("%d", &n) == EOF)  break;
            for(int i = 0;i < n;++i){
                for(int j = 0;j < n - 1 - i;++j)    printf("  ");   //输出格式
                for(int j = 0;j < 2 * i + 1;++j){
                    printf("%d",F[j]);
                    if(j != 2 * i ) printf(" ");
                    else printf("\n");
                }
            }
        }
    }
    return 0;
}


问题 C: 神奇的口袋

这个其实就是递归的思想,每个元素可以有或者没有,递归出口就是如果所有的都取完了或者大于等于要求的值。

#include <cstdio>
int nums[21], n, count, sum;//全局变量用于参数传递
void find(int k){
    if(sum == 40)  {
        count++;
        return;
    }
    else if(sum > 40)   return;
    if(k < n){
        sum += nums[k];//有这个元素
        find(k + 1);
        sum -= nums[k];
        find(k + 1);//无这个元素
    }
    return;
}
int main(){
    while(scanf("%d", &n) != EOF){
        for(int i = 0;i < n;++i)    scanf("%d", nums + i);
        count = 0,sum  = 0;
        find(0);
        printf("%d\n",count);
    }
    return 0;
}


问题 D: 八皇后

其实本身例题给的就是按照顺序返回的,所以我们用一个数组保存结果,然后直接输出就好了0.0


#include <cstdio>
#include <cstring>
#include <cmath>
int ans[92][8] = {0}, hashTable[9] = {0}, n = 8,ansnum = 0,P[8] = {0};
void generateP(int index){
  if(index == n){
  memcpy(ans[ansnum++], P, sizeof(P));//最终的结果保存
  return;
  }
  for(int x = 1; x<= n;x++){
  if(hashTable[x] == false){
    bool flag = true;
    for(int pre = 0; pre < index;++pre){
    if(abs(index - pre) == abs(x - P[pre])){
      flag = false;
      break;
    }
    }
    if(flag){   //回溯法
    P[index] = x;
    hashTable[x] = true;
    generateP(index+1);
    hashTable[x] = false;
    }
  }
  }
}
int main(){
    generateP(0);//打表打表
    int m, n;
    if(scanf("%d", &m) != EOF){
        while(m--){
            scanf("%d",&n);
            for(int i = 0;i < 8;++i)    printf("%d", ans[n - 1][i]);
            puts("");
        }
    }
    return 0;
}




相关文章
|
13天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
30 2
|
1月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
49 1
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
64 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
18 1
|
1月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
101 0
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
14 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
31 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
23 0
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
下一篇
无影云桌面