递归使用,潜在问题

全景相机APP 以下是一款**全景相机APP**的完整源码,支持全景照片拍摄(多帧拼接)、全景预览、鱼眼矫正、图片保存/分享、360°全景查看等核心功能,基于Android原生Camera2 API(替代过时的Camera API) + OpenCV(图像拼接) + GLSurfaceView(全景预览)实现,适配Android 8.0+设备,可直接编译运行。runOnUiThread(() -> tvFrameCount.setText("已拍摄:" + frameCount + "帧"));// X轴旋转(上下) 阅读详情

题记:

         本篇文章由一个“有问题”的程序,带入你进入递归的世界。虽然只是采用了递归中最简单的类型,尾递归。但却能使你马上感受到递归的妙用和烦恼。希望大家由浅入深、循序渐进,更好的使用递归。其中又涉及了递减运算符的使用,它同样是让你欢喜让你忧!虽然使用它给你带来高效的代码,但不小心同样让你深陷泥潭。

1.      #include <stdio.h>

2.      long fun(int );

3.      int i=1,j=3;        //i,j仅仅是为了说明递归时是第几级调用

4.     

5.      int main(void)

6.      {

7.               int n=3;    //测试数据较小,为了能说明问题,大了也无妨(勿溢出)

8.               printf ("3!/n");

9.               printf ("/nn=%d/n",fun(n));

10.             return 0;

11.   }

12.  

13.   long fun(int m)

14.   {

15.             long ans;

16.            

17.             if (m>0)

18.             {

19.  

20.                      printf ("Level:%d      m=%d,m:location %p/n",i++,m,&m);

21.  

22.                      //static int *p=&m;          //用于说明后缀递减运算时的问题     

23.                      //printf ("%d/n/n",*p);    //用于说明后缀递减运算时的问题

24.                     

25.                      ans=fun(m-1)*m;     //测试行

26.                     

27.                      //1.Right:ans=fun(m-1)*m;

28.  

29.                      //2.Error:ans=fun(m=m-1)*m;

30.                      //3.Error:ans=m*fun(m=m-1);

31.                      //4.Error:ans=fun(--m)*m;

32.  

33.                      //5.Error:ans=fun(m--)*m;

34.  

35.                      printf ("Return:        Level:%d  m=%d,m:location %p/n",j--,m,&m);       

36.                                        

37.             }

38.             else

39.             {       

40.                      ans=1;

41.             }

42.             return ans;

43.   }

                                               尝试分析5个可测选项会输出什么结果?

#1正确,依次调用、返回。最终效果为:fun(0)*5*4*3*2*1

 

#2/3/4表达式虽略有差异,但副作用相同,动作发生时间相同。

         貌似可以产生正确结果但运行却发现“n=0”,Why?发生了什么?这就要从递归的原理考虑,并对比#1的形式。如果是#1,在一级调用fun时(main对fun的调用),即fun(3),然后这个函数调用还没执行完,就执行了fun(2) 『自身调用,fun对fun,和#1一样,但同时它把m的值改变了!』… 效果如上文所示

         如果采用#2的形式,效果:fun(0)*4*3*2*1*0,所以“n=0”

 

#5是最复杂的,同时难于理解,最好能了解递归的细节、副操作、顺序点等知识(在文章最后,有简略解释)。

         一级调用fun(),即fun(3),注意传递给fun函数时,m就是3,而二级调用(调用自身)时,m的值还没改变呢(后缀递减)!又是fun(3)。三级调用也将是fun(3)……       递归虽然有条件检测语句(17行)用于结束递归,但m值相当于不变,一直递归,知道资源耗竭为止!

 

         是否有疑问呢?为什么要说“相当于”呢?如果你够细心,肯定发现了一点蛛丝马迹!

m值其实变了,但什么时候变了?以二级调用为例解释,即第一次自身调用时。fun函数调用时m给了它,随后m变成了,这可以通过加入22、23行代码加以验证,你会发现m确实变成了2。那三级调用不就是fun(2)了吗?不是!!

         递归是个很奇妙的东西!它总能迷惑你的双眼。

         每一级函数调用都有自己的变量!此m非彼m,可以从地址中发现(我在这个实例已经加入了显示地址的语句)。

         如果两个不同的函数,可能我们很容易的就明白,两个m的不同

如:

         fun1(int m)

         {

                   m+=3;

                   printf (“%d”,m);

         }

         fun2(int m)

         {

                   printf (“%d”,m);

         }

但换到递归,我们可能就摸不到头绪了。在此建议大家:多联系多思考,语言是由基本要素扩充扩展而来。如递归不过是函数调用自身,那么函数具有的特性,它也应该具有!

 

         递减运算符在这个程序给你带来的trouble够大吗?所以用之勿慎!c就是这样,够灵活以致可以够高效、够强大;灵活又使我们摔倒千次。

 

决定命运的关键:

                                               立即行动

从 SAP_FLP_USER 到项目落地:把 SAP S/4HANA 中的 SAP Fiori 授权体系真正讲透 SAP Fiori授权体系涉及前端访问、应用入口和后台业务对象三层权限,仅配置基础角色如SAP_FLP_USER无法满足实际业务需求。项目实践中常见用户能看到应用磁贴但无法访问数据的问题,多因授权模型设计不完整所致。SAP建议采用分层授权策略:基础层确保launchpad访问能力,业务层配置具体应用权限。管理员角色SAP_FLP_ADMIN需结合业务权限使用,测试时可临时配置S_SERVICE=*权限,但生产环境应遵循最小权限原则。完整的授权设计需参考SAP Fiori Apps Reference Lib 阅读详情

相关推荐

从波形到代码:手把手调试GaN图腾柱PFC的过零点切换与软启动策略

本文详细解析了GaN图腾柱无桥Boost PFC电路在过零点切换与软启动策略中的调试方法。通过波形分析、代码实现和寄存器配置,提供了解决误开通、震荡波形等问题的实用方案,帮助工程师优化电源设计效率与可靠性。

weixin_30831529的博客 424

使用递归的优缺点

优点: 1、代码简洁 2、易于理解 如在树的前/中/后序遍历中,递归的实现明显比循环简单。 缺点: 1、时间和空间的消耗比较大 递归由于是函数调用自身,而函数的调用时消耗时间和空间的,每一次函数调用,都需要在内存栈中分配空间以保存参数,返回值和临时变量,而往栈中压入和弹出数据也都需要时间,所以降低了效率。 2、重复计算 递归中又很多计算都是重复的,递归的本质时把一个问题分解成...

haovin的博客 1万+

Cursor+Playwright MCP实现UI全自动化,告别繁琐元素定位!

摘要:本文探讨了利用Cursor和PlaywrightMCP实现UI自动化测试的创新方法。通过将AI编程助手与浏览器自动化技术结合,解决了传统UI自动化测试中元素定位繁琐、维护成本高等痛点。文章详细介绍了项目架构设计、AI使用技巧(包括精准提问和编写.mdc规则文档),以及如何实现自然语言测试用例到自动化脚本的转换。最终实现了测试人员只需输入手工测试步骤,AI即可自动生成完整测试代码的智能化流程,并展望了通过Excel表格一键生成测试用例的未来发展方向,为UI自动化测试提供了高效解决方案。

baidu_29774881的博客 2795

递归潜在的风险

二叉树的遍历可以通过递归实现,下面是二叉树的先序遍历。 void preOrder(BiTree* root) { if (root != NULL) { visit(root); preOrder(root->lchild); preOrder(root->rchild); } }   递归算法存在一个问题:当递归层数过深时,有可能产生栈溢出,例如,如果二叉树只有几百个节点,那么通过递归实现没有问题,但是如果二叉树有几百万个节点,使用递归就可能会发生栈溢出。   在递归调用

bureau123的博客 1253

MDK5 Debug调试方法总结

MDK5 Debug调试方法总结

m0_70748084的博客 2万+

【从零开始玩量化7】easyTrader: 自动化(程序化)交易利器

前面的文章,我们介绍了数据获取工具AKShare, 量化回测工具backtrader等,这一篇,介绍程序化交易工具easyTrader。作者网名食灯鬼,目前项目在Github上的star数已经有6.7k。这可能是目前,开源能找到的,最好用的程序化交易库了。本文介绍了easyTrader的简单用法,这个包还有很多功能,后续再继续写文章探究。

量化投资助手的博客 1万+

递归的缺陷

递归的缺陷   递归虽然简洁,但是它也有显著的缺点。递归由于是函数调用自身,而函数调用是有时间和空间消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈中压入数据和弹出数据都需要时间。 一、效率   递归中有可能很多计算都是重复的,从而对性能带来很大的影响。递归的本质是把一个问题分解成多个小问题。如果多个小问题存在相互重...

baboon_chen 1244

【信息学奥赛一本通】1215:迷宫(bfs版)

同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。每组测试数据的第1行是一个正整数n(1≤n≤100),表示迷宫的规模是n×n的。接下来是一个n×n的矩阵,矩阵中的元素为‘再接下来一行是4个整数ha,la,hb,lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n的格点组成,每个格点只有2种状态,.

chu_xiaojie的博客 946

递归的优缺点

优点: 1. 简洁 2.在树的前序,中序,后序遍历算法中,递归的实现明显要比循环简单得多。 缺点: 1.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率 2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分

wangzhenling的专栏 4万+

2024顶级提示工程工具:提升效率的12个神器

LlamaIndex虽然本身不是直接的提示词编辑工具,但其整个设计都围绕着如何有效地将外部知识融入LLM的提示词。它提供了结构化的方式来管理“上下文窗口”——即哪些私有数据应该被包含在提示词中。通过优化索引结构和检索策略,可以确保提示词中包含最相关、最高质量的上下文信息,从而大幅提升LLM基于私有数据回答问题的准确性和相关性。同时,LlamaIndex允许开发者针对不同的查询类型和数据特点定制提示词模板,这使得提示词的复用和优化更加系统化。

AIGC应用创新大全的博客 1099

Docker 环境 Playwright MCP 部署全流程指南

Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬

勤奋的码农 1474

运用函数递归解决汉诺塔、青蛙跳台问题以及青蛙跳台潜在问题

假设青蛙从第n级台阶跳上第n+1级台阶的跳法数为f(n),那么当它只跳一级时,就可以从第n-1级台阶跳上第n级台阶,此时跳法数为f(n-1);当它一次跳两级时,就可以从第n-2级台阶跳上第n级台阶,此时跳法数为f(n-2)。青蛙跳台阶问题是一个经典的数学问题,其内容为:一只青蛙一次可以跳上一级台阶或两级台阶,问青蛙从第n级台阶跳上第n+1级台阶,总共有多少种跳法。需要注意的是,青蛙跳台阶问题还有其他的变种,例如每次只能跳一级或者每次只能跳两级,但是其本质都是相同的,都可以使用递归的方法来解决。

2302_81249757的博客 708

[QMT量化交易小白入门]-八十九、深度学习训练多维特征进行金融价格行情预测

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 218

深度优先搜索两种实现方法java模板 递归和栈以及使用栈的潜在问题

有两种实现 DFS 的方法。 dfs递归模版 第一种方法是进行递归: boolean DFS(Node cur, Node target, Set<Node> visited) { return true if cur is target; for (next : each neighbor of cur) { if (next is not in visited) { add next to visted; ret

usualheart的博客 958

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

递归求阶乘

java实现递归求阶乘

qq_50665369的博客 329

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【递归】迷宫问题

递归的概念 简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 递归调用机制 以递归求阶乘为例 public class Test { public static void main(String[] args) { System.out.println(jieChen(5)); //输出120 } public static int jieChen(int n) {

风继续吹 343

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

众数问题(递归分治)

众数问题(递归分治) 问题描述: 给定含有n个元素的多重集合s,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如, S-(1, 2, 2, 2, 3, 3, 5).多重集S的众数是2,其重数为3,对于给定的由n个自然数组成的多重集s,计算S的众数及其重数。如果出现多个众数,请输出最小的那个。 输入数据的第1行是多重集S中元素个数n (n<1 300000) ;...

weixin_45738232的博客 1万+

C++递归算法案例

#include<iostream> using namespace std; /* 什么是递归:出现自己调用自己的情况,被称为递归 递归的过程: 第一阶段:将原问题不断分解为新的子问题,将规模逐步减小 第二阶段:达到已知的,可以直接求解的终点,称为递归基 递归的条件: 1. 有反复执行同一个任务的过程(子问题,调用自身) 2. 有跳出反复执行过程的条件(递归出口) */ static int n; static long long

eyes++的博客 2797

python使用递归实现斐波那契数列

递归简而言之就是函数自己调用自己,在python中,会自动限制调用次数防止造成内存溢出下面时使用递归的方法实现斐波那契数列取值的代码 这段代码只是实现取出相应位置的数字,那么既然我们可以取出,当然就可以进行一系列的相关操作了,这里就不再演示了。递归思想很奥妙,但是也很危险,因为每一次调用函数,都会在内存空间中开辟一部分空间,如果没有设置出口的递归,就会不断开辟新空间,很容易造成内存溢出,而且递归的执行效率是不如循环的,所以使用时需要格外注意。...

hanxiaochuan1的博客 1万+

递归可能出现的性能问题

递归算法的代码很简洁。但同时也存在缺点。 递归由于函数要调用自身,而函数调用是有时间和空间的消耗的。每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈里压入数据和弹出数据都需要时间。 递归有可能很多计算都是重复的,从而对性能带来很大的负面影响。递归的本质是把一个问题分解成两个或者多个小问题。如果小问题有重叠的部分,那么就存在重复的计算。 除了效率外,递归还可能存在调用栈

暖心~的博客 6631

一种艺术般的问题解决办法-----递归

汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:

xiaoxie8023的博客 1235

普通递归与尾递归

递归(recursion)是一种常用于编程和算法中的方法,它允许函数调用自身来解决问题。递归主要涉及两个阶段:「递」和「归」。递:这个阶段涉及函数不断地调用自身,每次都传入更小或更简化的参数。这个过程一直持续,直到达到某个特定的条件,称为“终止条件”。终止条件是递归的关键,因为它定义了递归何时结束。归:一旦触发了终止条件,递归过程开始逆转。此时,程序开始从最深层的递归调用回溯,逐层返回,同时汇聚并处理每一层的结果。终止条件:这是递归过程中至关重要的部分,用于决定何时停止递归过程,避免无限循环。递归调用。

m0_67207209的博客 1155

递归实现有哪些常见的问题?

问题描述:递归必须有一个明确的基准情况(base case),用于停止递归。如果没有正确地定义基准情况,或者基准情况永远无法达到,那么递归将会无限循环下去,最终导致栈溢出或其他异常。解决方案:确保基准情况存在:设计递归算法时,务必保证至少有一种情况可以直接返回结果而不再进一步递归。验证输入合法性:对于递归函数的输入参数进行校验,防止非法输入导致基准情况失效。

邮箱:uemgyth@163.com 902

关于函数递归的使用

递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数自己调用自己,写一个简单的递归代码include<stdio.h>intmain()printf"hehe\n"main();//main函数中⼜调⽤了main函数return0;上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终也会陷⼊死递归,导致栈溢出。递归的思想:把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但规模较⼩的⼦问题来求解;

m0_73763230的博客 99

Java 递归算法

一、概述: Java递归:简单说就是函数自身直接或间接调用函数的本身。 二、应用场景: 若:一个功能在被重复使用,并每次使用时,参与运算的结果和上一次调用有关,这时就可以使用递归来解决这个问题。 使用要点: 1,递归一定明确条件。否则容易栈溢出。 2,注意一下递归的次数。 三、示例: 最简单的递归演示 public class recursi...

真香号 8774

来来来,我们聊一聊,为什么不建议使用递归操作?

Rt. 可能大家都或多或少的听见过类似的话或者建议: 尽量少使用递归操作,甚至干脆就不要使用递归操作。 但大家在听到这句话的时候,是否会产生过疑问,为什么不建议使用递归操作呢? 现在,我们就一起聊聊这个话题,看看递归到底会产生什么样的问题。 首先,大家思考一道算法题:如何实现二叉树的中序遍历? 对于树的遍历,无论是前序、中序还是后序遍历,大家可能下意识的就会想到使用递归操作,为什么呢?因为递归...

安正勋的博客 6569
上一篇: C++习题(from the teacher)Apr.
下一篇: 疑难杂症
P_leopard17
博客等级 码龄20年 2粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值