1樓:誰讓我揩油
如果只有一個盤,直接把它從one移到three位置;若有n個盤,就假設有n-1個可以知道怎麼移,那麼把上邊n-1個盤從one移到two位置,再把最底第n個盤從one移到three位置,最後把其餘n-1個從two移到three位置。問題就解決了。
對於n-1可以依靠n-2解決,以此類推,直到2個盤時可以依靠1個盤的解決方法,到1個盤時,已經給出瞭解決方法。這就是遞迴的思想,類似於數學的歸納法。
2樓:
確實,初學c的時候,漢諾塔的遞迴看起來確實是比較神奇的程式。
其中主要就在hanoi 這個遞迴函式,傳的引數裡面有一個n 代表是幾層遞迴。
如果n=1 代表只有一個,move(one,three); 就是把第一個移到第三個就行了。否則
第一個柱子上有n個(n>1) 要移到第三個。需要把上面的n-1個移到第二個,最下面的一個移到第三個,再把第二個柱子上的n-1個移到第三個。 要這三個步驟。
其中,第一個,和第三個步驟,和本身其實是一樣的。
就是把n-1個移到第二個,注意hanoi的引數
/* 定義hanoi函式,將n個盤從one座藉助two座,移到three座 */
two 即第二個引數,這是表示用來藉助的
就假設n=2 吧 hanoi(2,'a','b','c'); 變成了
hanoi(1,a,c,b); //這個代表a座上有一塊,需要藉助c座,移到b座
a--->c
hanoi(1,b,a,c); //這個代表b座上有一塊,需要藉助a座,移到c座
最後會輸出
a-->b
a-->c
b-->c
假設n=3 hanoi(3,'a','b','c');
hanoi(2,a,c,b); //這個代表a座上有兩塊,需要藉助c座,移到b座
a--->c
hanoi(2,b,a,c); //這個代表b座上有兩塊,需要藉助a座,移到c座
a座上有兩塊,需要藉助c座,移到b座 會輸出
a-->c
a-->b
c-->b
b座上有兩塊,需要藉助a座,移到c座 會輸出
b-->a
b-->c
a-->c
c語言函式遞迴呼叫習題,求答案解析
3樓:匿名使用者
f(6) ---> f(3) ;輸出6f(3) ---> f(1) ;輸出3f(1) ---> 輸出1 你倒著把函式替換成結果輸出1;輸出3;輸出6 所以結果就是136
c語言函式遞迴呼叫問題。
4樓:天涯海角
c語言函式呼叫整個過程是當準備呼叫函式時,先將形參以從右往左進行壓棧程式跳轉到函式入口,將函式的區域性變數壓棧(如果函式內部再呼叫函式就是在重複這個過程),函式返回時出棧,遞迴是在最後一個點上面函式返回,前面分配的資源根本沒有釋放,遞迴只有在最後一個返回點上面,根據遞迴順序反過來釋放資源,這也是為什麼當遞迴的資料量比較大或者遞迴的層次比較深的時候,很容易造成記憶體溢位的原因
5樓:豐又青
首先系統執行c語言程式是有個棧和堆的
遞迴過程主要用到了棧
棧的原理是先進先出,相當於摞盤子,我只能拿走最上面的那個系統執行函式時會把函式壓入棧裡
遞迴的過程就是利用這點,把函式壓入棧中,但是這個函式的結果需要執行另一個函式,再繼續壓入棧中,知道出現遞迴出口,就是最後一個函式有了結果
開始**,一個一個出棧,跟樓主的結論2差不多
c語言 程式設計題 使用函式遞迴呼叫編寫n!(階乘)——高手請導啊!
6樓:匿名使用者
#include
void main()
float fac(int n)
else
if(n==0||n==1)
f=1;
else
f=fac(n-1)*n;
return(f);}
7樓:
#include
int di(int n)
int main()
c語言函式遞迴呼叫漢諾塔問題
8樓:
我一步步的給你講,就會懂啦:
首先hanoi函式如果把當中的move函式給去掉,就變成了:
void hanoi(int n, char one , char two, charthree)
}也就是把move(one,three),變成了printf("%c->%c\n", one, three);。少了一個函式,更加清晰
所以這裡的hanoi函式就有了執行的內容:printf
下面以3個盤子為例進行模擬計算機的執行過程:
1、hanoi(3,a,b,c),開始了這步,進入第一層函式,計算機在函式中會進行自我的再次呼叫(第7行**)
2、(第7行):hanoi(2,a,c,b),於是這又是一個新的hanoi函式,這裡我把它成為第二層函式
同樣執行到第7行,卡住了,再次一次自我的呼叫
3、(進入第三層函式):hanoi(1,a,b,c),這裡的第三層n=1,所以在第四行就顯示出了"a->c",至此,第三層函式結束,回到呼叫他的第二層函式
4、在第二層當中,繼續第8行的內容,所以顯示出"a->b",繼續執行,到第9行,開始了有一次自我呼叫
5、把她稱為貳號第三層函式吧。。。hanoi(1,b,a,c),和第3步類似,這一層函式顯示出了"b->c",然後結束函式,返**用它的第二層函式
6、第二層函式執行完畢,返**用它的第一層函式
7、第一層函式中執行到第8行,顯示出"a->c",然後執行第9行:hanoi(2,b,a,c)
............
如果看到了這裡理清楚了關係就會懂啦,接下來還有一半,如果都寫下來就太複雜了-。-
你所說的空函式是指沒有返回值,但是這裡利用的是電腦呼叫函式的那種關係來解決的問題,比如上面的3步,會自動返回到第二層函式並繼續
還可以這樣理解漢諾塔,漢諾塔其實是將複雜的問題簡單化,
先不管他有多少個盤子從a到c,我只把它視作3步
就像上面那樣找個例子,反覆的按照**模擬計算機執行,過個五次六次,就會懂啦
9樓:谷歌地
#include
void move(int n,char a,char b,char c)
}main()
10樓:匿名使用者
這個程式是一個遞迴程式,並不是直接出結果的,我簡單解釋下好了
首先你要明白函式呼叫過程,比如:
……fun();
a++;
……在這個例子中,fun結束了會執行a++這種語句,這點沒問題吧。遞迴函式會重複呼叫同名的函式,但是不代表退出了一個同名函式就直接退出了整個函式,而是一層層的返回的。
//取n=3
hanoi(3,'a','b','c');//main中呼叫
hanoi(2,'a','c','b');//n=3,執行else
hanoi(1,'a','b','c');//n=2,執行else
move('a','c');//n=1,執行if,完畢後return到呼叫出執行下一句
move('a','b');//else中第二句
hanoi(1,'c','a','b');//else中第三句
move('c','b');//返**用處,但hanoi(2,'a','c','b')也執行完畢,繼續返回
move('a','c');
hanoi(2,'b','a','c');
hanoi(1,'b','c','a');
move('b','a');
move('b','c');
hanoi(1,'a','b','c');
move('a','c');
//返回至hanoi(1,'a','b','c');
//返回至hanoi(2,'b','a','c');
//返回至main中呼叫hanoi(3,'a','b','c');
遞迴雖然有點抽象,但還是按照函式呼叫的規則的,都是呼叫,結束返回到呼叫處。剛開始都是過程,直到遇到了遞迴結束條件,才結束遞迴呼叫的過程
你這裡的遞迴函式並不是你說的空函式,你仔細看下在這個函式執行過程中,肯定有某些語句是起作用的,你這裡就是move起作用了,你仔細理解下
11樓:
這個遞迴根本就不需要運算,如果你非要理解成一定要有運算的話,那他那個輸出就算是運算了,只是遞迴呼叫的時候是根據上一層遞迴而改變的,主要還是你要理解這個演算法的邏輯過程,而不是糾結於怎麼運算,在紙上一步一步演算一下你就會懂得。
12樓:朝陽
先呼叫一次hanoi(m,'a','b','c'),其中引數m是你輸入的值.
如果你輸入的m為1,則直接呼叫move(one,three),然後直接輸入 a-->c換行
如果你輸入的m不為1,假設為2,則執行過程如下
執行一次hanoi(1,one,three,two),執行 move(one,three),然後直接輸出a-->b換行
執行一次move(one,three),然後直接輸出 a-->c換行
執行一次hanoi(1,two,one,three),執行move(one,three),然後直接輸出b-->c換行
如果你輸入的數字》2那就相應的進入到更多層的hanoi()函式中迴圈
13樓:聽不清啊
void move ( char x, char y ) //完成一個盤子從x 移到 y
14樓:清蓮玉
move函式有實際作用啊。
c語言 函式遞迴呼叫是怎麼回事?
15樓:匿名使用者
一般來說是自己呼叫自己,一般有兩個分支,一個分支是呼叫自己,還有一個分支是結束條件
如求n!
int f(int n)
還有一個比較複雜一點,是雙向呼叫,也就是a函式呼叫b函式,b函式在呼叫a函式
這樣迴圈呼叫,其實基於這個道理,還有多個函式互相呼叫,不過這樣的情況很少見
但萬變不離其宗,每個函式都有兩個分支,一個是結束條件,一個是呼叫函式
16樓:匿名使用者
遞迴呼叫是一種特殊的巢狀呼叫,是某個函式呼叫自己,而不是另外一個函式。但是呼叫的時候肯定有一個終止條件,退出遞迴呼叫。
17樓:匿名使用者
函式自己呼叫自己,或兩函式互相巢狀。
18樓:匿名使用者
自己呼叫自己就是遞迴,資料結構中的樹遍歷可以用遞迴實現。
c語言遞迴求階乘,c語言怎麼用遞迴呼叫函式的方法求n的階乘?
舉例 用遞迴方法求n include int main int n int y printf input a integer number scanf d n y fac n printf d d n n,y return 0 int fac int n int f if n 0 printf n ...
c語言函式遞迴的理解,C語言函式遞迴的理解
對於遞迴,我大致引用一位計算機競賽教練的話 皇帝傳近臣 幫我算一下1 2 3等於多少 然後近臣傳太監 幫我算一下2 3等於多少 太監回近臣 2 3 5 然後近臣回皇帝 1 2 3 1 5 6 這裡每個人為一次函式呼叫。即是說 從頭探到尾,在尾處找到答案後,再回傳給頭。c語言遞迴呼叫的理解 所謂遞迴,...
關於C語言被呼叫函式的宣告問題!高手都進來看一下哈
不同編譯器處理不同的。在vc 6.0環境下,如果返回型別是int型別確實可以不宣告,你的程式可以無誤通過。但是建議只要用到自定義函式都宣告下,於人於己都方便 include include int strin len char str void main 這樣就不用在main 中宣告 因為程式由上至...