求大佬解释一下这个基于C语言写的汉诺塔程序的一个步骤,谢谢! 汉诺塔问题,程序为什么这样写?请解释一下,谢谢

\u7528c\u8bed\u8a00\u7f16\u5199\u7a0b\u5e8f\u6c42\u6c49\u8bfa\u5854\u7684\u79fb\u52a8\u6b65\u9aa4

#include
void move(char a,char b)
{
printf("%c->%c\n",a,b);
}
void f(int n,char a,char b,char c)
{
if(n==1) move(a,c);
else
{
f(n-1,a,c,b);
move(a,c);
f(n-1,b,a,c);
}
}
void main()
{
int n;
scanf("%d",&n);
f(n,'a','b','c');
}
\u8fd9\u662f\u6211\u7684\u4ee3\u7801 \u524d\u9762\u7684\u662f\u5b9a\u4e49\u4e00\u4e2a\u51fd\u6570 \u8fd9\u91cc\u9012\u5f52\u4f53\u73b0\u5728\u51fd\u6570\u91cc\u9762\u8fd8\u6709\u51fd\u6570 \u4e8e\u662f\u4f1a\u4e00\u6b21\u53c8\u4e00\u6b21\u7684\u8ba1\u7b97 \u76f4\u5230\u6700\u540e\u628aN-1\u4ee5\u524d\u7684\u90fd\u79fb\u5230B\uff0c\u6700\u4e0b\u9762\u7684\u79fb\u5230C\uff0c\u518d\u628a\u5176\u4ed6\u7684\u4eceB\u79fb\u5230C\u3002\u3002 \u65e0\u8fd4\u56de\u7684\u8bdd \u5e94\u8be5\u662f\u8fd9\u91cc\u7528void \u6ca1\u6709return\u8fd4\u56de\u6570\u503c

\u8981\u9012\u5f52\u7684\u554a\uff0c\u56e0\u4e3a\u5f88\u591a\u7b97\u6cd5\u90fd\u662f\u4e00\u6837\u7684 \uff0c\u901a\u8fc7\u81ea\u5df1\u8c03\u7528\u81ea\u5df1\u5c31\u80fd\u5b8c\u6210\u8fd9\u4e2a\u8fc7\u7a0b\u3002



我将开始的递归部分分解了、不知解释清楚没有。每层递归里n的值是不变的、为什么是2请看图。



n在代码中实际表达了两种意思,一种表示当前正在移动的盘号(对应move函数),一种是要移动几个盘子(对应hanoi函数)。建议你修正一下move函数,添加参数n,以便在printf里输出当前移动的是哪一个盘

如果没有尾递归和尾递归优化,递归结束时会一层层地往回走。
4->3->2->1->2->3->4这样。
底下的“调用堆栈”可以看到栈帧的情况。

  • 姹傛暀C璇█ 澶т浆鍒嗘瀽涓涓嬭繖涓绋嬪簭
    绛旓細//f鍑芥暟鐨勫畾涔夛紝杩斿洖涓涓暣鏁帮紝杩斿洖鐨勬暣鏁版槸浼犲叆鐨勫弬鏁皒鐨2鍊 int f(int x){ return x*2;}
  • 姹傚ぇ浣В閲婁竴涓嬭繖涓熀浜嶤璇█鍐鐨勬眽璇哄绋嬪簭鐨勪竴涓楠,璋㈣阿!_鐧惧害鐭...
    绛旓細鎴戝皢寮濮嬬殑閫掑綊閮ㄥ垎鍒嗚В浜嗐佷笉鐭瑙i噴娓呮娌℃湁銆傛瘡灞傞掑綊閲宯鐨勫兼槸涓嶅彉鐨勩佷负浠涔堟槸2璇风湅鍥俱
  • 姹傚ぇ浣В閲婁笅杩欎釜C璇█缂栫▼銆
    绛旓細鎵撳紑鈥滆川妫.txt鈥濇枃浠讹紱鍚戞枃浠朵腑鍐欏叆information缁撴瀯浣撶殑鏁版嵁 濡傛灉鍒颁簡鏂囦欢鏈熬鍒欓鍑 information鐨勫睘鎬у寘鎷琲d銆乶ame绛夛紝鍏蜂綋鍚箟闇鍙傝冪浉鍏虫枃妗f垨information鐨勫畾涔夋敞閲娿傜粨鏋勪綋锛氬湪C璇█涓悧锛岀粨鏋勪綋鏄竴绉嶆暟鎹粨鏋勶紝鏄疌璇█涓仛鍚堟暟鎹被鍨嬬殑涓绫汇傜粨鏋勪綋鍙互琚0鏄庝负鍙橀噺銆佹寚閽堛佹暟缁勭瓑锛岀敤浠ュ疄鐜拌緝澶嶆潅鐨...
  • 鍙互璁茶В涓涓嬭繖涓や釜c璇█鐨勭紪绋嬮鍚
    绛旓細绗竴涓▼搴忓氨鏄竴涓暟瀛﹂鐨勮绠椼傝繖閲屽啓鐨勭▼搴忔槸浣跨敤浜唂or寰幆锛屽湪鍘熸湁鍒濆1鐨勫熀纭涓婁箻浠10娆1.1銆傝绠楀畬鎴愪互鍚庤鍑忓幓鍘熷硷紝鍐嶄箻浠100锛岃繖鏍峰氨绠楁垚浜嗙櫨鍒嗘瘮銆傛渶鍚庤娉ㄦ剰杈撳嚭鐧惧垎鍙峰湪C璇█褰撲腑锛岃浣跨敤涓や釜杩炵画鐨勭櫨鍒嗗彿銆備笅闈㈡槸绋嬪簭鐨勪唬鐮佸拰杩愯鐨勭粨鏋溿#include int main(){ float p=1;int i;for(...
  • 姹c璇█澶т浆缁涓涓瓒呰缁嗙殑瑙i噴
    绛旓細static int a[3]={1,2,3} 鍑芥暟fun涓紝鏁扮粍a[3]瀹氫箟涓洪潤鎬佸彉閲忋備富鍑芥暟璋冪敤fun(0)锛屽嚱鏁癴un涓舰鍙俷鎺ユ敹璧嬪0锛屽嵆n=0 for(k=0;k<3;k++) x[]+=x[]-n x[0]=x[0]+x[0]-n=1+1-0=2 x[1]=x[1]+x[1]-n=2+2-0=4 x[3]=x[3]+x[3]-n=3+3-0=6 姝ゆ椂鏁扮粍鍙樹负...
  • 鏈夋病鏈c璇█澶т浆瑙i噴涓涓?
    绛旓細鏍规簮鏉ヨ嚜浜庨粯璁ょ被鍨嬨傚鏋滀笉鍦ㄧ紪璇戠幆澧冪壒娈婃寚鏄庣殑璇濓紝娴偣鏁伴粯璁ouble鍨嬶紝鑰屽嵆渚挎槸鍚屼竴涓诞鐐规暟锛屽叾single鍜宒ouble鐨勫兼槸涓嶅悓鐨勶紝姣旇緝蹇呯劧FALSE銆傜▼搴忎腑鍔犱笂寮哄埗绫诲瀷灏卞彲浠ヨВ闄わ紙褰撶劧涔熷彲浠ヤ慨鏀圭紪璇戝櫒榛樿绫诲瀷璁剧疆锛夛紝濡備笅鍥炬墍绀猴細
  • 鍝綅澶т浆甯垜瑙g瓟涓涓嬭繖涓猚璇█鐨勭▼搴忔庝箞鍐,鏈濂芥湁瀹屾暣鐨勭▼搴,璋㈣阿...
    绛旓細include <stdio.h> int main(){ int sum,f,i,n;for(;scanf("%d",&n)==1;){ for(f=1,i=1,sum=0;i<=n;++i,f=-f){ sum+=f*i;} printf("%d\n",sum);} return 0;}
  • C璇█,鍙互鐨勮瘽璁涓涓姣忎竴姝ュ憲銆姹傚ぇ浣甯繖
    绛旓細3銆佽В鏋愬姛鑳介渶姹傦紝瀹炵幇浣撶Н鍜岄潰绉垎鍒渶瑕佽绠楀渾鐨勯潰绉佸懆闀垮拰鏌变晶闈㈢Н銆傛墍浠ョ▼搴忓簲鍖呭惈鎵鏈夊疄鐜板姛鑳界殑鍑芥暟锛屽垎鍒负锛氳绠楀渾闈㈢Н锛岃绠楀渾鍛ㄩ暱锛岃绠楀渾鏌变晶闈㈢Н锛岃绠楀渾鏌变綋绉傦紙杩欓噷閮ㄥ垎鍑芥暟寰堢畝鍗曪紝浣犲彲鑳芥兂涓轰粈涔堜笉鐩存帴鍐欏湪main鍑芥暟涓紝鍥犱负杩欎簺浠g爜鍦ㄩ」鐩腑鍙兘浼氳澶氭閲嶅璋冪敤锛屽啓鎴愮嫭绔嬪嚱鏁拌皟鐢ㄦ洿绠娲侊紝...
  • 姹傚ぇ浣В閲婁笅鏈夊叧c璇█鐨杩涓棰 璋㈣阿
    绛旓細绗竴琛岃緭鍑烘暟瀛楃殑鐪熷疄鍊硷紝15 绗簩琛岃緭鍑烘暟瀛楀搴旂殑浜岃繘鍒跺瓧绗︿覆锛001111 convert() 鍑芥暟鐨勫姛鑳芥槸灏嗚緭鍏ョ殑瀛楃涓 s1 瑙嗕綔琛ㄧず鍏繘鍒剁殑瀛楃涓诧紝鐒跺悗灏嗗叾鎹㈢畻涓鸿〃绀轰簩杩涘埗鐨勫瓧绗︿覆骞跺啓鍏ュ瓧绗︿覆 s2 涓紝骞惰繑鍥炶繖涓叓杩涘埗鏁扮殑鐪熷疄鍊笺傚ソ濂藉涔犲ぉ澶╁悜涓 ...
  • 姹傚ぇ浣甯垜鐪涓涓嬭繖涓狢璇█浠g爜涓轰粈涔堟湁闂?
    绛旓細int main() { int i,n,x,a[10],*res;printf("Input n:\n"); scanf("%d",&n);printf("Input %d numbers:\n",n); for(i=0;i<n;i++) scanf("%d",&a[i]);res=a; printf("Input x:\n"); scanf("%d",&x);for(i=0;i<n;i++) if(*res!=x) res++; else { ...
  • 扩展阅读:报了警不立案教你三招 ... #lovecraftlocker ... 学python编程入门 ... 我朋友是c语言大佬b站 ... 警察最怕听到的十句话 ... b站原神c语言大佬 ... 下列不属于编程语言 ... 怼人专用语言 ... 怼人大全 句句经典 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网