這篇文章給大家聊聊關于java中的foreach的實現,以及java中for和foreach的區別對應的知識點,希望對各位有所幫助,不要忘了收藏本站哦。
c語言如何實現循環點名
可以使用for循環語句實現循環點名。for循環語句是一種常用的循環結構,在C語言中非常方便實現循環點名。使用C語言中的for循環語句,可以通過設置一個計數變量,不斷循環著讀入學生名字,每讀入一個名字就打印出來,這樣就實現了循環點名。以下是代碼示例:for(inti=1;i
java程序for循環打印菱形
1、首先在eclipse中創建一個測試類TestPractice,在main方法中實現菱形的打印。
2、菱形的打印可以分成上下兩個部分來實現。首先,我們來分析下上部分的圖形規律:
4空格、1星、換行;
3空格、3星、換行;
2空格、5星、換行;
1空格、7星、換行;
0空格、9星、換行;
3、接下來,我們來分析下下部分的圖形規律:
0空格、9星、換行;
1空格、7星、換行;
2空格、5星、換行;
3空格、3星、換行;
4空格、1星、換行;
4、通過分析,這樣我們對整個的圖形規律有了很大的了解,接下來,我們先來實現上部分的圖形實現。
代碼:
for(inti=0;i<5;i++){
for(intk=4;k>i;k--){
System.out.print("");
}
for(intj=0;j<2*i+1;j++){
System.out.print("*");
}
System.out.println();
}
5、下部分的圖形實現:
代碼:
for(inti=0;i<5;i++){
for(intk=0;k<i;k++){
System.out.print("");
}
for(intj=10;j>2*i+1;j--){
System.out.print("*");
}
System.out.println();
}
6、最后將兩部分代碼合并,一起執行即可完成菱形的輸出。
用for循環如何求斐波那契數列
斐波那契數列(Fibonaccisequence),又稱黃金分割數列。
因數學家列昂納多·斐波那契(LeonardodaFibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……
在數學上,斐波那契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用。
規則:這個數列從第3項開始,每一項都等于前兩項之和。知道規則以后,我們看看采用Java語言的for循環如何實現斐波那契數列:
執行代碼:
輸出如下:
斐波那契數列為:[1,1,2,3,5,8,13,21,34,55]上面就是斐波那契數列的實現方式,是不是很簡單呢?
與黃金分割比關系當n趨向于無窮大時,前一項與后一項的比值越來越逼近黃金分割0.618(或者說后一項與前一項的比值小數部分越來越逼近0.618):
1÷1=1,1÷2=0.5,2÷3=0.666...,3÷5=0.6,5÷8=0.625…………,55÷89=0.617977……………144÷233=0.618025…46368÷75025=0.6180339886…...
越到后面,這些比值越接近黃金比。
以上就是斐波那契數列的簡單介紹和實現方式,歡迎大家評論交流!
我是【java架構設計】,歡迎點贊、評論,關注我,持續為您提供科技領域優質內容!java的BigInteger的乘法運算是用什么算法實現的
JDK8中,BigInteger的乘法,根據兩個乘數的大小不同,分別采用三種算法。
1、當兩個乘數有一個小于2的(32x80)次方時,使用雙重循環直接相乘;
2、否則,當兩個乘數都小于2的(32x240)次方時,使用Karatsuba算法;
3、否則,使用Toom-Cookmultiplication算法。
java for循環,條件每次加2怎么寫
for循環的第三個賦值加減中每次加21、for循環語法定義for(賦初值;判斷條件;賦值加減){執行語句}2、示例:for(inti=0;i<10;i=i+2){//這里最后一個賦值加減中,i每次都增加2}
如何在Java中實現二叉搜索樹
二叉搜索樹需滿足以下四個條件:
若任意節點的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;若任意節點的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;任意節點的左、右子樹也分別為二叉查找樹;沒有鍵值相等的節點。二叉搜索樹舉例:
圖一
接下來將基于圖一介紹二叉搜索樹相關操作。
首先,應先有一個節點對象相關的類,命名為Node。
1classNode{2intkey;3intvalue;4NodeleftChild;5NoderightChild;67publicNode(intkey,intvalue){8this.key=key;9this.value=value;10}1112publicvoiddisplayNode(){1314}15}Node類中包含key值,用于確定節點在樹中相應位置,value值代表要存儲的內容,還含有指向左右孩子節點的兩個引用。
接下來看下搜索樹相應的類:
1classTree{2Noderoot;//保存樹的根34publicNodefind(intkey){//查找指定節點56}78publicvoidinsert(intkey,intvalue){//插入節點910}1112publicbooleandelete(intkey){//刪除指定節點1314}1516privateNodegetDirectPostNode(NodedelNode){//得到待刪除節點的直接后繼節點1718}1920publicvoidpreOrder(NoderootNode){//先序遍歷樹2122}2324publicvoidinOrder(NoderootNode){//中序遍歷樹2526}2728publicvoidpostOrder(NoderootNode){//后序遍歷樹2930}31}類中表示樹的框架,包含查找、插入、遍歷、刪除相應方法,其中刪除節點操作最為復雜,接下來一一介紹。
一、查找某個節點
由于二叉搜索樹定義上的特殊性,只需根據輸入的key值從根開始進行比較,若小于根的key值,則與根的左子樹比較,大于根的key值與根的右子樹比較,以此類推,找到則返回相應節點,否則返回null。
1publicNodefind(intkey){2NodecurrentNode=root;3while(currentNode!=null&¤tNode.key!=key){4if(key<currentNode.key){5currentNode=currentNode.leftChild;6}else{7currentNode=currentNode.rightChild;8}9}10returncurrentNode;11}二、插入節點
與查找操作相似,由于二叉搜索樹的特殊性,待插入的節點也需要從根節點開始進行比較,小于根節點則與根節點左子樹比較,反之則與右子樹比較,直到左子樹為空或右子樹為空,則插入到相應為空的位置,在比較的過程中要注意保存父節點的信息及待插入的位置是父節點的左子樹還是右子樹,才能插入到正確的位置。
1publicvoidinsert(intkey,intvalue){2if(root==null){3root=newNode(key,value);4return;5}6NodecurrentNode=root;7NodeparentNode=root;8booleanisLeftChild=true;9while(currentNode!=null){10parentNode=currentNode;11if(key<currentNode.key){12currentNode=currentNode.leftChild;13isLeftChild=true;14}else{15currentNode=currentNode.rightChild;16isLeftChild=false;17}18}19NodenewNode=newNode(key,value);20if(isLeftChild){21parentNode.leftChild=newNode;22}else{23parentNode.rightChild=newNode;24}25}三、遍歷二叉搜索樹
遍歷操作與遍歷普通二叉樹操作完全相同,不贅述。
1publicvoidpreOrder(NoderootNode){2if(rootNode!=null){3System.out.println(rootNode.key+""+rootNode.value);4preOrder(rootNode.leftChild);5preOrder(rootNode.rightChild);6}7}89publicvoidinOrder(NoderootNode){10if(rootNode!=null){11inOrder(rootNode.leftChild);12System.out.println(rootNode.key+""+rootNode.value);13inOrder(rootNode.rightChild);14}15}1617publicvoidpostOrder(NoderootNode){18if(rootNode!=null){19postOrder(rootNode.leftChild);20postOrder(rootNode.rightChild);21System.out.println(rootNode.key+""+rootNode.value);22}23}四、刪除指定節點。
在二叉搜索樹中刪除節點操作較復雜,可分為以下三種情況。
1、待刪除的節點為葉子節點,可直接刪除。
publicbooleandelete(intkey){NodecurrentNode=root;//用來保存待刪除節點NodeparentNode=root;//用來保存待刪除節點的父親節點booleanisLeftChild=true;//用來確定待刪除節點是父親節點的左孩子還是右孩子while(currentNode!=null&¤tNode.key!=key){parentNode=currentNode;if(key<currentNode.key){currentNode=currentNode.leftChild;isLeftChild=true;}else{currentNode=currentNode.rightChild;isLeftChild=false;}}if(currentNode==null){returnfalse;}if(currentNode.leftChild==null&¤tNode.rightChild==null){//要刪除的節點為葉子節點if(currentNode==root)root=null;elseif(isLeftChild)parentNode.leftChild=null;elseparentNode.rightChild=null;}......}2、待刪除節點只有一個孩子節點
例如刪除圖一中的key值為11的節點,只需將key值為13的節點的左孩子指向key值為12的節點即可達到刪除key值為11的節點的目的。
由以上分析可得代碼如下(接上述delete方法省略號后):
1elseif(currentNode.rightChild==null){//要刪除的節點只有左孩子2if(currentNode==root)3root=currentNode.leftChild;4elseif(isLeftChild)5parentNode.leftChild=currentNode.leftChild;6else7parentNode.rightChild=currentNode.leftChild;8}elseif(currentNode.leftChild==null){//要刪除的節點只有右孩子9if(currentNode==root)10root=currentNode.rightChild;11elseif(isLeftChild)12parentNode.leftChild=currentNode.rightChild;13else14parentNode.rightChild=currentNode.rightChild;15}......3、待刪除節點既有左孩子,又有右孩子。
例如刪除圖一中key值為10的節點,這時就需要用key值為10的節點的中序后繼節點(節點11)來代替key值為10的節點,并刪除key值為10的節點的中序后繼節點,由中序遍歷相關規則可知,key值為10的節點的直接中序后繼節點一定是其右子樹中key值最小的節點,所以此中序后繼節點一定不含子節點或者只含有一個右孩子,刪除此中序后繼節點就屬于上述1,2所述情況。圖一中key值為10的節點的直接中序后繼節點為11,節點11含有一個右孩子12。
所以刪除圖一中key值為10的節點分為以下幾步:
a、找到key值為10的節點的直接中序后繼節點(即其右子樹中值最小的節點11),并刪除此直接中序后繼節點。
1privateNodegetDirectPostNode(NodedelNode){//方法作用為得到待刪除節點的直接后繼節點23NodeparentNode=delNode;//用來保存待刪除節點的直接后繼節點的父親節點4NodedirecrPostNode=delNode;//用來保存待刪除節點的直接后繼節點5NodecurrentNode=delNode.rightChild;6while(currentNode!=null){7parentNode=direcrPostNode;8direcrPostNode=currentNode;9currentNode=currentNode.leftChild;10}11if(direcrPostNode!=delNode.rightChild){//從樹中刪除此直接后繼節點12parentNode.leftChild=direcrPostNode.rightChild;13direcrPostNode.rightChild=null;14}15returndirecrPostNode;//返回此直接后繼節點1617}b、將此后繼節點的key、value值賦給待刪除節點的key,value值。(接情況二中省略號代碼之后)
1else{//要刪除的節點既有左孩子又有右孩子23//思路:用待刪除節點右子樹中的key值最小節點的值來替代要刪除的節點的值,然后刪除右子樹中key值最小的節點4//右子樹key最小的節點一定不含左子樹,所以刪除這個key最小的節點一定是屬于葉子節點或者只有右子樹的節點5NodedirectPostNode=getDirectPostNode(currentNode);6currentNode.key=directPostNode.key;7currentNode.value=directPostNode.value;89}至此刪除指定節點的操作結束。
最后給出完整代碼及簡單測試代碼及測試結果:
1classNode{2intkey;3intvalue;4NodeleftChild;5NoderightChild;67publicNode(intkey,intvalue){8this.key=key;9this.value=value;10}1112publicvoiddisplayNode(){1314}15}1617classTree{18Noderoot;1920publicNodefind(intkey){21NodecurrentNode=root;22while(currentNode!=null&¤tNode.key!=key){23if(key<currentNode.key){24currentNode=currentNode.leftChild;25}else{26currentNode=currentNode.rightChild;27}28}29returncurrentNode;30}3132publicvoidinsert(intkey,intvalue){33if(root==null){34root=newNode(key,value);35return;36}37NodecurrentNode=root;38NodeparentNode=root;39booleanisLeftChild=true;40while(currentNode!=null){41parentNode=currentNode;42if(key<currentNode.key){43currentNode=currentNode.leftChild;44isLeftChild=true;45}else{46currentNode=currentNode.rightChild;47isLeftChild=false;48}49}50NodenewNode=newNode(key,value);51if(isLeftChild){52parentNode.leftChild=newNode;53}else{54parentNode.rightChild=newNode;55}56}5758publicbooleandelete(intkey){59NodecurrentNode=root;60NodeparentNode=root;61booleanisLeftChild=true;62while(currentNode!=null&¤tNode.key!=key){63parentNode=currentNode;64if(key<currentNode.key){65currentNode=currentNode.leftChild;66isLeftChild=true;67}else{68currentNode=currentNode.rightChild;69isLeftChild=false;70}71}72if(currentNode==null){73returnfalse;74}75if(currentNode.leftChild==null&¤tNode.rightChild==null){76//要刪除的節點為葉子節點77if(currentNode==root)78root=null;79elseif(isLeftChild)80parentNode.leftChild=null;81else82parentNode.rightChild=null;83}elseif(currentNode.rightChild==null){//要刪除的節點只有左孩子84if(currentNode==root)85root=currentNode.leftChild;86elseif(isLeftChild)87parentNode.leftChild=currentNode.leftChild;88else89parentNode.rightChild=currentNode.leftChild;90}elseif(currentNode.leftChild==null){//要刪除的節點只有右孩子91if(currentNode==root)92root=currentNode.rightChild;93elseif(isLeftChild)94parentNode.leftChild=currentNode.rightChild;95else96parentNode.rightChild=currentNode.rightChild;97}else{//要刪除的節點既有左孩子又有右孩子98//思路:用待刪除節點右子樹中的key值最小節點的值來替代要刪除的節點的值,然后刪除右子樹中key值最小的節點99//右子樹key最小的節點一定不含左子樹,所以刪除這個key最小的節點一定是屬于葉子節點或者只有右子樹的節點100NodedirectPostNode=getDirectPostNode(currentNode);101currentNode.key=directPostNode.key;102currentNode.value=directPostNode.value;103}104returntrue;105}106107privateNodegetDirectPostNode(NodedelNode){//方法作用為得到待刪除節點的直接后繼節點108109NodeparentNode=delNode;//用來保存待刪除節點的直接后繼節點的父親節點110NodedirecrPostNode=delNode;//用來保存待刪除節點的直接后繼節點111NodecurrentNode=delNode.rightChild;112while(currentNode!=null){113parentNode=direcrPostNode;114direcrPostNode=currentNode;115currentNode=currentNode.leftChild;116}117if(direcrPostNode!=delNode.rightChild){//從樹中刪除此直接后繼節點118parentNode.leftChild=direcrPostNode.rightChild;119direcrPostNode.rightChild=null;120}121returndirecrPostNode;//返回此直接后繼節點122123}124125publicvoidpreOrder(NoderootNode){126if(rootNode!=null){127System.out.println(rootNode.key+""+rootNode.value);128preOrder(rootNode.leftChild);129preOrder(rootNode.rightChild);130}131}132133publicvoidinOrder(NoderootNode){134if(rootNode!=null){135inOrder(rootNode.leftChild);136System.out.println("key:"+rootNode.key+""+"value:"+rootNode.value);137inOrder(rootNode.rightChild);138}139}140141publicvoidpostOrder(NoderootNode){142if(rootNode!=null){143postOrder(rootNode.leftChild);144postOrder(rootNode.rightChild);145System.out.println(rootNode.key+""+rootNode.value);146}147}privatevoiddestroy(Nodetree){if(tree==null)return;if(tree.left!=null)destroy(tree.leftChild);if(tree.right!=null)destroy(tree.rightChild);tree=null;}publicvoiddestory(){destory(root);}148}149publicclassBinarySearchTreeApp{150publicstaticvoidmain(String[]args){151Treetree=newTree();152tree.insert(6,6);//插入操作,構造圖一所示的二叉樹153tree.insert(3,3);154tree.insert(14,14);155tree.insert(16,16);156tree.insert(10,10);157tree.insert(9,9);158tree.insert(13,13);159tree.insert(11,11);160tree.insert(12,12);161162System.out.println("刪除前遍歷結果");163tree.inOrder(tree.root);//中序遍歷操作164165System.out.println("刪除節點10之后遍歷結果");166tree.delete(10);//刪除操作167tree.inOrder(tree.root);168}169}測試結果:
好了,本文到此結束,如果可以幫助到大家,還望關注本站哦!