1. 程式人生 > >Java的遞迴演算法

Java的遞迴演算法

遞迴演算法設計的基本思想是:對於一個複雜的問題,把原問題分解為若干個相對簡單類同的子問題,繼續下去直到子問題簡單到能夠直接求解,也就是說到了遞推的出口,這樣原問題就有遞推得解。
關鍵要抓住的是:
(1)遞迴出口
(2)地推逐步向出口逼近
例子:
example: 求5的階乘。。      
  
如下:   
  
Java程式碼 複製程式碼
  1. publicclass Test {         
  2. staticint multiply(int n){         
  3. if(n==1||n==0)         
  4. return n;         
  5. else
  6. return n*multiply(n-1);         
  7. }         
  8. publicstaticvoid main(String[] args){         
  9. System.out.println(multiply(
    10));         
  10. }         
  11. }      
public class Test {      
static int multiply(int n){      
if(n==1||n==0)      
return n;      
else      
return n*multiply(n-1);      
}      
   
public static void main(String[] args){      
System.out.println(multiply(10));      
}      
}    

  
  
上面的multiply是一個階乘的例子。其實遞迴遞迴,從字面上解釋就是在方法本身呼叫自己的方法,或者間接呼叫;看上面的程式,拿multiply(5)來說:   
n=5;執行 5*multiply(4);   
--------------------   
這時候看multiply(4)   
n=4 執行 4*multiply(3);   
-------------------   
看multiply(3)   
n=3,執行 3*multiply(2);   
---------------   
mulitply(2);   
n=2 執行 2*mulitply(1);   
這時候,return 1;往上返回   
2*1向上返回   
3*(2*1)向上返回   
4*(3*(2*1)) 向上返回   
5*(4*(3*(2*1)) ) = 120   
所以程式輸出120;   
這事簡單的遞迴的例子;所以可以看出來遞迴的關鍵得有遞迴出口(本體的If語句),還有遞迴方法;   


以下是我在百度知道碰到一個朋友的提問,也是關於遞迴演算法的:

------------------------問題------------------------------

本人剛學JAVA,沒有任何程式設計基礎,各位高手見笑。
Java程式碼
複製程式碼
  1. publicclass Count   
  2. {   
  3. staticvoid count(int n)               //遞迴方法
  4.     {   
  5. if (n<5)    
  6.             count(n+1);    
  7.         System.out.print("     "+n);   
  8.     }    
  9. publicstaticvoid main(String args[])   
  10.     {   
  11.         count(1);   
  12.         System.out.println();   
  13.     }   
  14. }  
public class Count
{
    static void count(int n)               //遞迴方法
    {
        if (n<5) 
            count(n+1); 
        System.out.print("     "+n);
    } 
    public static void main(String args[])
    {
        count(1);
        System.out.println();
    }
}
請詳細講解這段程式是怎麼執行的,我的理解是先執行main函式裡的count(1),然後進入count方法,N值為1,所以執行IF語句,直到count(5),此時退出if 迴圈,列印N=5 ,然後應該沒有要執行的東西了,可是答案是5     4     3     2     1 ,請問這是怎麼回事,謝謝!


--------------------回答---------------------------

先執行count(1),然後進入count方法,N值為1,所以執行IF語句,也就是執行count(2),然後進入count方法,N值為2,所以執行IF語句,也就是執行count(3),然後進入count方法,N值為3,所以執行IF語句,也就是執行count(4),然後進入count方法,N值為4,所以執行IF語句,也就是執行count(5),然後進入count方法,N值為5,所以不執行IF語句,然後執行System.out.print(" "+n); 也就是輸出5,然後本次引數為5的count方法呼叫結束了,返回到呼叫它的引數為4的count方法中,然後執行System.out.print(" "+n);輸出4,然後一直這樣下去,輸出3,2,1 。這裡需要說明的是在執行count(5)的時候,count(4)、count(3)、count(2)、count(1)都沒有執行完畢,他們都在等自己方法體中的count(n+1)執行完畢,然後再執行System.out.print(" "+n);

相關推薦

基礎&演算法|Java演算法練習

Java遞迴演算法練習 使用java實現幾個比較簡單的遞歸面試題 寫遞迴演算法的時候,可以類比數學歸納法。 將每步先簡化 單向連結串列與遞迴演算法 實現單向連結串列 Node.java /** * @ClassName Node * @Descripti

java演算法求n的階乘(n>1,n是正整數)

/** * 遞迴演算法計算n的階乘 * 遞迴:自己調自己 * @param n * @return */ public static Integer jieCheng(Integer n) {

JAVA演算法

1.什麼是遞迴演算法   遞迴演算法就是直接或間接呼叫自己的演算法2.問題1:一列數的規則如下: 1、1、2、3、5、8、13、21、34 ,求第30位數是多少?使用遞迴實現 1 public class FibonacciSequence { 2 public static void main(S

java基礎(4)Java演算法

一、遞迴演算法的概念   在一個方法的方法體內,呼叫該方法本身,稱為遞迴 遞迴:包含了一種隱式的迴圈,會重複執行某段程式碼,但是這種重複不需要使用迴圈語句,不會看到for、while、do……while語句 二、思考    遞迴 實現: 求一個數的階乘     使用遞

Java 演算法 求和 查詢動態選單

public class Test { private int sum=0,num=1; public int calSum(int maxnum){ if(num<=maxnum){ sum+=n

java演算法示例,單引數,多引數

這兩天公司來了個新同事,順便帶一下,給他解釋下遞迴。 要點:找出口,出口即呼叫自己直到不能呼叫為止,不能呼叫即自身方法已經return到具體值。 例: package test; public class Test1 { /** * 題目:1-n相加 * @p

快速排序的非演算法JAVA,使用棧來模擬

使用棧來模擬遞迴,消去qSort中的尾遞迴 public class stackQSort { private static int Partition(int[] arr, int start, int end) { //arr[start]為挖的第一個坑 int key =

Java利用演算法實現24點遊戲

24點遊戲 經典的紙牌益智遊戲,常見遊戲規則:         從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求程式設計解決24點遊戲。         基本要求: 隨機生成4個代表撲克牌牌面

Java中常見的演算法

.常見遞迴演算法 (1)最常見的就是階乘,比如求5的階乘,數學公式就是:5*4*3*2*1,程式碼: package suanfa; public class Digui {     public static int digui(int n){         i

Java篇:WeChat 模仿微信紅包的核心演算法

模仿WeChat的拼手氣紅包 ,例如:10000元傳送50個包。 這50個紅包隨機分配,但是最後相加等於10000. 採用隨機數,隨機紅包金額。 又制定規則,不斷地遞迴運算。 限制最小的紅包金額,例如:0.01,因為考慮人性化,最小的紅包不能是0. 不限制可發出的紅

java漢諾塔演算法

相傳在古印度聖廟中,有一種被稱為漢諾塔(Hanoi)的遊戲。該遊戲是在一塊銅板裝置上,有三根杆(編號A、B、C),在A杆自下而上、由大到小按順序放置64個金盤(如下圖)。遊戲的目標:把A杆上的金盤全部移到B杆上,並仍保持原有順序疊好。操作規則:每次只能移動一個盤

Fibonacci序列演算法推(Java

Fibonacci遞推公式: f(1) = f(2) = 1;f(n) = f(n-1)+f(n-2)(n>2).在這裡取他除以10007的餘數 遞迴 public class Fibonacci { static int digui(int n) {

Java十進位制轉二進位制,演算法

用遞迴演算法求一個int的二進位制字串; 思路是:遞迴最簡單情況(遞迴出口)是0和1;其餘的是先呼叫遞迴算出n/2的二進位制字串,然後加上n時的位數(n % 2)。 import java.util

有關演算法的面試題java實現

什麼叫遞迴? 遞迴是方法(函式)呼叫方法本身的一種程式設計技巧; 使用遞迴需要滿足2個條件:     1)有反覆執行的過程(呼叫自身)     2)有跳出反覆執行過程的條件(遞迴出口) 遞迴演算法的應

Java演算法 演算法計算階乘

程式碼: package com.xu.main; import java.util.Scanner; public class P9 { static long fact(int n) {

Java演算法

遞迴演算法設計的基本思想是:對於一個複雜的問題,把原問題分解為若干個相對簡單類同的子問題,繼續下去直到子問題簡單到能夠直接求解,也就是說到了遞推的出口,這樣原問題就有遞推得解。 關鍵要抓住的是: (1)遞迴出口 (2)地推逐步向出口逼近 例子: example: 求5的階乘。。          如下:   

警察智力訓練--藍橋杯歷年java真題(java實現eval演算法

匪警請撥110,即使手機欠費也可撥通!    為了保障社會秩序,保護人民群眾生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,因而需要經常性地進行體力訓練和智力訓練!    某批警察叔叔正在進行智力訓練:    1 23 4 5 6 7 8 9 = 110;    請看上邊

java 解決 漢諾塔問題(演算法

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Exercise6_37 extends JApplet implements ActionListener

JAVA 複習氣泡排序 , 演算法

使用氣泡排序,首先我們要知道,外層n-1,內層n-i-1,外層是表示迴圈的次數,內層表示迴圈比較,比較的方式是用賦值的方式進行比較的,用我們比較通俗的話來說,兩兩相比,大者後移。氣泡排序和遞迴是基本演算

演算法 Java實現

緣起於網易的一道演算法筆試題,之前對遞迴演算法有一個初步印象。感覺遞迴好像就是一種迭代的過程。將原問題不斷分解為若干個與原問題類似更小的問題,直到小問題已知,也就是找到了遞迴演算法的出口,此時,再講問題迴帶得到解的結果。廢話不多說,先上題。 題目是這樣的:有一隻猴子第一天摘