前言:
目前小伙伴们对“vb递归算法经典实例”可能比较关切,小伙伴们都需要知道一些“vb递归算法经典实例”的相关资讯。那么小编也在网络上搜集了一些有关“vb递归算法经典实例””的相关文章,希望朋友们能喜欢,朋友们快快来学习一下吧!本文讲解力扣算法(LeetCode)第9题(回文数操作),用VB语言的解法教程。通过本文的练习,老铁们可以更加深入的掌握VB递归循环的思路,熟悉并掌握While循环的用法。
我们先看一下题目:
题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121输出:true
示例 2:
输入:x = -121输出:false解释:从左向右读, 为 -121 。从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10输出:false解释:从右向左读, 为 01 。因此它不是一个回文数。
力扣官方给的这道题的题解非常精妙、逻辑也很完备,但是理解起来还是有一定的困难(起码我是这样),于是我给了一套自己的简单方法,主要思路是运用While Wend循环。
官方题解相对比较复杂,因为考虑了负数和尾号为0的情况,我给的答案简单一些,适合新手。按照惯例,本教程分为三大部分:
完整代码原理演示代码解释
— 1 —
完整代码
力扣算法第9题(回文数)简单方法的完整VB代码(基于Access数据库)如下,在实际应用时要学会调用。
Option Compare Database'力扣算法第9题,官方解题过程比较缜密'我这个方法比较简单一些,适合初学者Function reverse(x As Double) reverse = 0 '起始值为0 While (x > 0) '输入数字大于0时,继续循环 reverse = reverse * 10 + x Mod 10 'x Mod 10是取余函数,68 mod 10 = 8 '68除以10,60能除动,8除不动 '8 mod 10 = 8 x = x \ 10 '符号\代表除完之后取整,68 \ 10 = 6 '6 \ 10 = 0 Wend '继续循环,直到x \ 10值为0End Function
我可以把官方题解的思路(我已经改装成VB语言,可以直接模块调用)给大家,大家对比一下各自的优劣。本节课讲简单版本的解题思路。
Function revertedNumberJudge(x As Double) As StringDim revertedNumber As Long If x < 0 Then revertedNumberJudge = "该数不是回文数!" Else revertedNumber = 0 While x > revertedNumber revertedNumber = revertedNumber * 10 _ + x Mod 10 x = x \ 10 Wend If x = Int(revertedNumber) Or _ x = Int(revertedNumber \ 10) Then revertedNumberJudge = "该数是回文数!" Else revertedNumberJudge = "该数不是回文数!" End If End IfEnd Function
— 2 —
原理演示
力扣算法第9题(回文数)我给的解题思路,是通过While Wend循环,给定一个输入的数字x,不停的取这个数字的最后一位,把这位数字乘以10再加上下一次的最后一位,直到所有位数全部取完,数字就倒转过来了。
本案例取x值为“12345”,reverse(数字倒转回来的值)初始值为0,这可以视为第0次循环。
第1次循环,
reverse值=reverse*10 + x Mod 10,由于reverse的初始值为0,12345 mod 10(mod取模函数,非常常用)的值为5,因此第1次循环后,reverse的值为5。
计算完reverse值之后,x也要进行去尾处理,x \ 10=12345 \ 10=1234
(注:在VB语言中,“\”表示整除,得到商但不含小数,比如3 \ 5 = 0)。
第2次循环,
reverse值=reverse*10 + x Mod 10,现在reverse的值为5,x的值为1234,那么reverse=5*10 + 1234 Mod 10 = 54。
由于x>0,计算reverse值之后,根据While Wend程序设置,要继续对x=1234进行去尾处理,x \ 10=123。
第3次循环,
reverse值=reverse*10 + x Mod 10=54*10 + 123 Mod 10 = 543。
继续对x=123进行去尾处理,x \ 10=12。
第4次循环,
reverse值=reverse*10 + x Mod 10=543*10 + 12 Mod 10 = 5432。
继续对x=12进行去尾处理,x \ 10=1。
第5次循环,
reverse值=reverse*10 + x Mod 10=5432*10 + 1 Mod 10 = 54321。
继续对x=1进行去尾处理,x \ 10=0。
注意,这时x已经=0,不满足While x>0的条件,因此循环结束。
— 3 —
代码解释
力扣算法第9题(回文数)的简单解法,语句比较精炼,思想也比较巧妙,核心是利用现有函数Mod取模、符号“\"整除去尾进行循环计算。
完整代码如下(去掉了代码注释)
Function reverse(x As Double) reverse = 0 While (x > 0) reverse = reverse * 10 + x Mod 10 x = x \ 10 Wend End Function
本案例是在模块中进行编程,应用的时候进行临时调用。
Function reverse(x As Double)
reverse(x)就是一个函数y=f(x),x是自变量,reverse相当于因变量。输入x的值,Function就会做相应的计算,reverse就是计算的结果。
x是输入的数字,reverse是数字反转后的数字。
reverse = 0 While (x > 0) reverse = reverse * 10 + x Mod 10 x = x \ 10 Wend
这段代码是循环代码,注意从reverse开始循环的,reverse=0是必须有的。
reverse计算在前,x计算在后,顺序不能搞错。
reverse和x都利用了递归的原理,不停的计算并且调用原来的自己(我没理解错吧,是递归?)直到循环条件While(x>0)不成立为止。
reverse*10就是把上一次得到的数字乘以10,再加上x Mod 10得到的尾数,完成了一次数字调转。这是第1次计算,然后89进行去尾操作,x=8。
比如89这个数,第1次循环reverse=0,直接加上89 Mod 10=9,因此第1次循环后reverse=9,x=8。
第2次循环,reverse要先加上第1次循环后的自己,reverse=9*10,再加上x Mod 10 = 8 Mod 10 = 8,reverse=90+8=98。
x这时候再进行去尾操作就等于0了,因为8\10=0。
因为x=0不符合While(x>0)的条件,循环到此戛然而止。
这段代码还是非常短小精悍的,体现了递归的思想和能力,充分利用了把复杂问题分解化、简单化的计算机编程思想。
Access数据库窗体中调用代码如下:
Private Sub Text1_AfterUpdate() Text2 = reverse(Val(Nz(Text1))) If Val(Text2) = Val(Text1) Then Text3 = "是回文数" Else Text3 = "不是回文数" End IfEnd Sub
这段调用代码就比较容易理解了,
Text2 = reverse(Val(Nz(Text1)))
直接调用reverse这个我们封装好的模块函数,就能直接计算数字倒转的结果,非常简洁。
If Val(Text2) = Val(Text1) Then Text3 = "是回文数" Else Text3 = "不是回文数" End If
这一段是判断是否是回文数的语句,如果输入文本框Text1=输出文本框Text2.那么就是回文数,如果不相等那就不是回文数。
这就是力扣算法第9题的简单版解题方法,当然有更复杂、更简洁、更严谨的方法,也就是官方给的方法,留待下回分解吧。
标签: #vb递归算法经典实例