JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » 交流、聊天、灌水  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 看不懂河內塔的邏輯,是算笨嗎?
rDai





發文: 75
於 2011-01-18 23:10 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我已經看了很多次了
也很認真在看可是就是看不懂
我也看良葛格分享的很多演算法
可是不管我看了幾次,就是不懂..= =
這樣是算很笨嗎?
還是大家一開始也都看不懂呢Tongue


reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
yulingyeh2003





發文: 37
於 2011-01-18 23:38 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
當然不是啦,怎能壞疑自己呢?
加油,找其他會的人教你。


reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
hearenly

壓力是一種享受,但有時卻是一種折磨。



發文: 322
於 2011-01-19 08:57 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我認為沒有什麼是看不懂,這就像為什麼程度在差到了國中,
就是能看的懂國小的東西,因為經驗及視野都不一樣了,所以
你現在看不懂,代表很多地方或者是說小地方不了解,而這些
地方剛好又是貫穿整個核心的重要部份,所以你何不從另一個
角度或從不懂地方下手。


reply to postreply to post
心中浮現出回家種田的想法~><"
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
rDai





發文: 75
於 2011-01-19 09:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最近看了一本書內容提到
學程式常用數學表示式,是不是數學要好
作者說不用,只要有國一到高一的程度即可
看到這句話,嗯..
我承認我沒有高一的程度阿Ora..
全部都忘光了
前幾天還問我朋友什麼是質數
什麼時候輾轉相除法+_+


reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
linuxhsu





發文: 12
於 2011-01-19 09:47 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
遞迴對剛接觸的人本來就不是很好懂唄,君不見還有『遞迴只應天上有,凡人應當用迴圈』的名句出現……XD

我是覺得,可以先了解一些比較簡單的遞迴(例如怎麼用遞迴求 N+1、或是 N! 和費式數列這些東西),再去看河內塔會比較好一點,當初河內塔也是上課老師講了又講,聽了好幾遍才搞懂。

另外我記得我的老師曾經說過一句話--『不要去管遞迴的詳細步驟是怎麼計算的,你只要確定你的解題想法是正確的就好。』

雖然我不完全認同這樣的說法,不過或許對一些人來說,這樣會比較容易了解遞迴解是怎麼一回事。


reply to postreply to post
blog: http://bone.twbbs.org.tw/blog
plurk: http://plurk.com/brianhsu
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
winddknight





發文: 162
於 2011-01-19 12:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我也看不懂,所以我都交給 Google ~ XD

reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
javaZero





發文: 159
於 2011-01-19 16:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
post deleteTongue

javaZero edited on 2011-01-19 16:53
reply to postreply to post
fortune is the act of good well.
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
rachex2000





發文: 9
於 2011-01-19 17:02 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
剛接觸遞回的人看不懂是很正常的
但其實遞回沒有想像中難
或者說要"開竅"

思考遞回要"逆"著想
正著想絕對搞不懂
如果學會逆著想
會發現根本不用管細節

以河內塔(n個盤子, 從上到下用1到n編號, 從柱子A移到B,可以利用C)來說
只要注意一點:
"最大的盤子只要搬一次從A到B, 在搬最大盤子之前一定要先把上面n-1個先搬到C"
下面else部分的前2行就是在說這件事

所以你只要想:在搬最大盤子前要完成什麼事
這樣應該就很容易理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//參數說明: n:盤子數 a:原處, b:目標, c:借用
void TowerOfHanoi(int n, char a, char b, char c)
{
     if (n == 1)
     {
        printf("Move disk %d from peg %c to peg %c\n", n, a, b);        
     }
     else
     {
        TowerOfHanoi(n - 1, a, c, b);
        printf("Move disk %d from peg %c to peg %c\n", n, a, b);  
        TowerOfHanoi(n - 1, c, b, a);                   
     }            
}
 
TowerOfHanoi(3, 'A', 'B', 'C'); 


rachex2000 edited on 2011-01-20 10:35
reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rachex2000]
rachex2000





發文: 9
於 2011-01-19 17:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
很多人說遞迴用不到
所以不太了解甚至不用學也沒關係
但我覺得不是這樣
遞回在實際"寫程式"時或許不太會這樣寫
但對"思考程式"卻絕對有很大幫助

我的心得是
瞭解遞回能幫助程式的架構
即使只是寫一般的應用程式如資料庫或網頁類的
都能使思慮更清楚


rachex2000 edited on 2011-01-20 10:38
reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
rachex2000





發文: 9
於 2011-01-19 17:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
另外 原PO只說看不懂河內塔的邏輯 沒說到遞回
不過大家都知道應該說的是用遞回解河內塔
其實用迴圈才是更不懂吧 至少我還沒試過用迴圈寫Tongue

我覺得用遞回解河內塔寫成程式這件事
應該分成兩部份探討
1.演算法: 要先想出
先把最上面n-1個盤子從A搬到C,再搬最大盤子到B,再搬那在C的n-1個到B.


這段邏輯一般人是想不出來的,所以不知道沒關係,重要的是先懂要這樣解

2.寫成程式:以上演算法就有遞迴的思考在裡面

所以原PO應該要著重在知道演算法後,試著用程式描述邏輯,
自己想出演算法比較難 但是用程式描述演算法並不難

話說回來 河內塔之所以經典
就是因為真正瞭解它的演算法
往往就很容易寫出程式
稍微一點不瞭解 寫程式時就會卡卡的


rachex2000 edited on 2011-01-19 17:50
reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rachex2000]
atpqq





發文: 427
於 2011-01-19 18:01 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
rachex2000 wrote:
另外 原PO只說看不懂河內塔的邏輯 沒說到遞回
不過大家都知道應該說的是用遞回解河內塔
其實用迴圈才是更不懂吧 至少我還沒試過用迴圈寫Tongue

我覺得用遞回解河內塔寫成程式這件事
應該分成兩部份探討
1.演算法: 要先想出
先把最上面n-1個盤子從A搬到C,再搬最大盤子到B,再搬那在C的n-1個到B.


這段邏輯一般人是想不出來的,所以不知道沒關係,重要的是先懂要這樣解

2.寫成程式:以上演算法就有遞迴的思考在裡面

所以原PO應該要著重在知道演算法後,試著用程式描述邏輯,
自己想出演算法比較難 但是用程式描述演算法並不難

話說回來 河內塔之所以經典
就是因為真正瞭解它的演算法
往往就很容易寫出程式
稍微一點不瞭解 寫程式時就會卡卡的


http://www.javaworld.com.tw/jute/post/view?bid=5&id=267339&tpg=1&ppg=1&sty=1&age=0#267339


reply to postreply to post
在無法開花結果的地方努力,就是執著;在可以開花結果的地方努力,就是堅持。
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
funy





發文: 78
於 2011-01-19 18:11 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
阿彌陀佛
請善用金剛經的智慧
不要著執於"遞迴"二字去看原始碼,即可悟道
他不過一樣還是method,邏輯上並無特殊之處,只是某些程式語言不支援故拿出來炫耀罷了。


reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
puremonkey2006





發文: 112
於 2011-01-19 18:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
fyi
[ 資料結構 小學堂 ] 堆疊 : 堆疊應用 (河內塔問題)


reply to postreply to post
Where there is a will, there is a way
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
poshoung





發文: 51
於 2011-01-31 23:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
壞消息是,算~
好消息是,業界比你笨的不少
Cool

言歸正傳
第一時間能否解出陌生問題牽涉到每個人的智慧都不一樣
但經驗累積後,一般人也都能慢慢去理解原本他不理解的問題
還好我們一般遇到的情況都不需要特別聰明的天份去處理
所以勤能補拙這句話在這行業還是行得通的


reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
javaZero





發文: 159
於 2011-02-01 13:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不懂就算了,跟笨不笨一點關係都沒有,真正笨的是懂了卻不知應用在那,那跟沒懂是一樣的

reply to postreply to post
fortune is the act of good well.
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
ThomasJava





發文: 0
於 2012-03-02 19:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;
 
public class Hanoi {
    public static void main(String args[]) {
        System.out.print("請輸入盤數:");
        Scanner s = new Scanner(System.in);
        Hanoi hanoi = new Hanoi();
        hanoi.move(s.nextInt(), 'A', 'B', 'C');
    }
    public void move(int n, char a, char b, char c) {
        if(n == 1) {
            System.out.println("盤由 " + a + " 移至 " + c);
        }
        else {
            move(n - 1, a, c, b); //132
            move(1, a, b, c);   //123
            move(n - 1, b, a, c); //213
        }
    }
} 

n=1 , 盤由A移至C

只要n!=1 進入else 3個move都要跑,

            n a b c
n=2 , else (2-1, a, c, b) =(1, a, c, b) 盤由A移至B
     (1 , a, b, c) =(1, a, b, c) 盤由A移至C
     (2-1, b, a, c) =(1, b, a, c) 盤由B移至C

n=3 進入else

一、(3-1, a, c, b)= (2, a, c, b)
二、(1 , a, b, c)= (1, a, b, c)
三、(3-1, b, a, c)= (2, b, a, c)


為了避免搞混,先假設else中的 a=1、b=2、c=3代入,即else內容為 (n-1,132)、(1,123)、(n-1,213)
一、(3-1, a, c, b)= (2, a, c, b) 此時 a=1 c=2 b=3 代入
  n-1,132→(2-1, a, b, c) 1,123→(1, a, c, b) n-1,213→(2-1, c, a, b)
二、不變 = (1, a, b, c)
三、(3-1, b, a, c)= (2, b, a, c) 此時 b=1 a=2 c=3 代入
  n-1,132→(2-1, b, c, a) 1,123→(1, b, a, c) n-1,213→(2-1, a, b, c)

if(n==1) println("盤由 " + a + " 移至 " + c);

一、(3-1, a, c, b)= (2, a, c, b) = (1, a, b, c) →盤由A移至C
                (1, a, c, b) →盤由A移至B
                (1, c, a, b) →盤由C移至B
二、(1 , a, b, c)= (1, a, b, c)       →盤由A移至C
三、(3-1, b, a, c)= (2, b, a, c) = (1, b, c, a)→盤由B移至A
                (1, b, a, c)→盤由B移至C
                (1, a, b, c)→盤由A移至C

n=4
(4-1, a, c, b) (1 a, b, c) (4-1, b, a, c)
=(3-1, a, b, c) (1, a, c, b) (3-1, c, a, b) (1, a, b, c) (3-1, b, c, a) (1, b, a, c) (3-1, a, b, c)
=(2-1, a, c, b)(1, a, b, c)(2-1, b, a, c)(1, a, c, b)(2-1, c, b, a)(1, c, a, b)(2-1, a, c, b) (1, a, b, c)(2-1, b, a, c)(1, b, c, a)(2-1, c, b ,a)(1, b, a, c)(2-1, a, c, b)(1, a, b, c)(2-1, b, a, c)

(1, a, c, b)→盤由A移至B
(1, a, b, c)→盤由A移至C
(1, b, a, c)→盤由B移至C
(1, a, c, b)→盤由A移至B
(1, c, b, a)→盤由C移至A
(1, c, a, b)→盤由C移至B
(1, a, c, b)→盤由A移至B
(1, a, b, c)→盤由A移至C
(1, b, a, c)→盤由B移至C
(1, b, c, a)→盤由B移至A
(1, c, b ,a)→盤由C移至A
(1, b, a, c)→盤由B移至C
(1, a, c, b)→盤由A移至B
(1, a, b, c)→盤由A移至C
(1, b, a, c)→盤由B移至C


ThomasJava edited on 2012-03-02 19:51
reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:rDai]
tkcn





發文: 59
於 2012-03-03 22:11 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
個人覺得不算。

當初我也是看了好幾天,
不斷的思考、畫圖、埋 log 觀察,
大概到第五天才突然開竅。

在這之後兩、三年內我也沒看再看過比河內塔複雜的遞迴了 :p


reply to postreply to post
作者 Re:看不懂河內塔的邏輯,是算笨嗎? [Re:tkcn]
qrtt1





發文: 1749
於 2012-03-04 11:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
tkcn wrote:
個人覺得不算。

當初我也是看了好幾天,
不斷的思考、畫圖、埋 log 觀察,
大概到第五天才突然開竅。

在這之後兩、三年內我也沒看再看過比河內塔複雜的遞迴了 :p


我到現在還是沒看懂 XD


reply to postreply to post
蝸牛角上爭何事?石火光中寄此身,隨富隨貧且歡樂,不開口笑是癡人。
my notes
» JWorld@TW »  交流、聊天、灌水

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8