ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 2530|回复: 30

[原创] 精通递归程序设计(VBA)--写给非科班VBA爱好者

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-5-23 09:44 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:递归
本帖最后由 liu-aguang 于 2018-5-23 09:47 编辑

捕获.PNG

精通递归程序设计.rar

345.67 KB, 下载次数: 375

点评

拜读过您的历史帖子,受益匪浅  发表于 2018-5-23 16:27

评分

参与人数 17财富 +30 鲜花 +34 技术 +1 收起 理由
jsgj2023 + 1 优秀作品
ykqrs + 3 优秀作品
makelot + 2 优秀作品
ardu95 + 2 太强大了
YZC51 + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-5-23 12:35 来自手机 | 显示全部楼层

<html>
<head>
<meta charset="utf-8">
<title>作业</title>
</head>
<body>
<a href="http://club.excelhome.net/forum.php?mod=viewthread&tid=1415332&extra=&mobile=2">原文 精通递归程序设计(VBA)--写给非科班VBA爱好者</a>
<h3>练习1:求1+2+3+…+n的值。</h3>
<textarea name="sheet1" id="sheet1" cols="40" rows="5">
1,2,3</textarea><br>
<input type=button id=calculate value=计算 onclick="calculate()">
<div id=result>
<div>
</body>
<script type="text/javascript">
var output="";
function calculate(){

printDemo();
}
function printf(a, first, last,sum){
    sum=parseInt(a[first])+sum;
    output+="第"+first+"次调用子函数结果";
    output+=sum;//输出调试
    output+="<br>";
    if (first < last){
     printf(a, first + 1, last,sum);
       
    }else{
   
        output+="最终结果是:"+sum;
        document.getElementById("result").innerHTML=output;

    }
    return sum;
}
function printDemo(){
  //  a = Array(1, 2, 3, 4)
  output="";
var  a=document.getElementById("sheet1").value.split(",");
  //    Call printf(a, LBound(a), UBound(a))
  printf(a,0,a.length-1,0);

}
printDemo();
</script>
<html>

评分

参与人数 1鲜花 +2 收起 理由
liu-aguang + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-5-23 14:47 来自手机 | 显示全部楼层

<html>
<head>
<meta charset="utf-8">
<title>作业2用折半法查找。类似于indexof</title>
</head>
<body>
<a href="http://club.excelhome.net/forum.php?mod=viewthread&tid=1415332&extra=&mobile=2">原文 精通递归程序设计(VBA)--写给非科班VBA爱好者</a>
<h3>练习2: 在一个有序的整数数组中,查找是否存在元素X,若存在返回其索引编号,若不存在返回-1。其解法可用折半查找法:取数组中间值与X比较,若相等则返回;若中间值小于X,则继续对数值较大的一侧取中间值比较。如此反复进行。请用递归法写出代码。
用折半法查找。类似于indexof.发现sort数值也是按文本排序的。折半查找大数有优势
</h3>
<textarea name="sheet1" id="sheet1" cols="40" rows="5">
alert,boss,1,2,31,11,ok</textarea><br>数组必须是有序数组 按文本排序!
<br>
<input type=text id=find value=boss><br>
<input type=button id=calculate value=查找 onclick="calculate()">
<div id=result>
<div>
</body>
<script type="text/javascript">
var output="";
var k=0;
function calculate(){

printDemo();
}
function printf(a, first, last,find){

var mid=Math.floor((first+last)/2)
    output+="第"+k+"次调用子函数结果";
    k++;
    output+=mid;//输出调试
    output+="<br>";
if(first==last) {
        output+="最终结果是:"+mid;
        document.getElementById("result").innerHTML=output;

return mid;//最后一个没有找到

}


if (find==a[mid]){//找到

        output+="最终结果是:"+mid;
        document.getElementById("result").innerHTML=output;
return mid;
}
if(find<a[mid]){
last=mid-1;
}else{
first=mid+1;
}
printf(a,first,last,find);


}
function printDemo(){
//   a = Array(1, 2,3,14)
  output="";
var  a=document.getElementById("sheet1").value.split(",");
a=a.sort();
document.getElementById("sheet1").value=a.join(",");
alert('排序后'+a);
  //    Call printf(a, LBound(a), UBound(a))
  var find=document.getElementById('find').value;
//  alert(find)
var l=  printf(a,0,a.length-1,find);

}
printDemo();
</script>
<html>

评分

参与人数 2鲜花 +5 收起 理由
VBA万岁 + 3 感谢帮助
liu-aguang + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-23 15:31 | 显示全部楼层
zpy2 发表于 2018-5-23 14:47
作业2用折半法查找。类似于indexof

是网站出问题了?

TA的精华主题

TA的得分主题

发表于 2018-5-23 15:43 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-23 16:17 | 显示全部楼层
zpy2 发表于 2018-5-23 14:47
作业2用折半法查找。类似于indexof

写递归代码最好能养成一个好习惯: 不要在代码内对参数重新赋值. 即不要把它作双重用途. 特别是在一些复杂环境下容易犯糊涂而出错.  若有某种需求,可将参数值赋给另一个变量.

评分

参与人数 1鲜花 +2 收起 理由
zpy2 + 2 感谢帮助

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-5-24 13:58 | 显示全部楼层
请老师给解释一下,这段代码没理解过来.
If first = last Then
        maxA = a(first)
当first = last时,first = 8,此时,a(8)不应该是1嘛?为什么会是a(0)对应的数字8呢?

Function maxA(a, first, last)  ‘求解数组a下标first上标last之间元素的最大值maxA
    Dim temp
    If first = last Then
        maxA = a(first)
    Else
        temp = maxA(a, first + 1, last)
        maxA = IIf(a(fisrt) > temp, a(first), temp)
    End If
End Function
Sub DemoMax()
    a = Array(8, 9, 7, 2, 5, 9, 10, 21, 1)
    MsgBox maxA(a, LBound(a), UBound(a))
End Sub

TA的精华主题

TA的得分主题

发表于 2018-5-24 14:24 | 显示全部楼层
本帖最后由 zhangcheng6688 于 2018-5-24 14:46 编辑

留底,以后慢慢欣赏研究,以前在学校最难理解的就是递归了

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-24 16:03 | 显示全部楼层
zhouxiao 发表于 2018-5-24 13:58
请老师给解释一下,这段代码没理解过来.
If first = last Then
        maxA = a(first)

你需要再回看第1页的内容,了解递归算法. 针对本题,first=last时,是终止条件: 它把a(first)这个值返回到它的上层(倒数第2层), 不要理解成是最后返回的结果

评分

参与人数 1鲜花 +3 收起 理由
VBA万岁 + 3 感谢帮助

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-5-24 17:23 | 显示全部楼层
liu-aguang 发表于 2018-5-24 16:03
你需要再回看第1页的内容,了解递归算法. 针对本题,first=last时,是终止条件: 它把a(first)这个值返回到它 ...

老师这样一说,更晕了.
如老师说言,调试很费解.
其实我想说,这么多年,有些代码刚开始理解不了,调试过后,能理解了.
但是递归是一直没有理解了,不知道怎么调试才能理解它.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,每天学会一个新技能

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-8-23 12:25 , Processed in 0.107157 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表