C語(yǔ)言從入門(mén)到精通(鵬哥帶你C語(yǔ)言從入門(mén)到精通,譚浩強(qiáng)C語(yǔ)言教程C語(yǔ)言程序設(shè)計(jì)C

經(jīng)典漢諾塔問(wèn)題
以下是一個(gè)使用 C 語(yǔ)言編寫(xiě)的經(jīng)典漢諾塔問(wèn)題的代碼,并附有注釋解釋每個(gè)步驟的含義:
#include <stdio.h> // 漢諾塔函數(shù),從柱子A移動(dòng)n個(gè)盤(pán)子到柱子C,借助柱子B void hanoi(int n, char from_peg, char to_peg, char aux_peg) { ??if (n == 1) { ????printf("移動(dòng)盤(pán)子 1 從 %c 到 %c\n", from_peg, to_peg); ????return; ?} ??// 將上面 n-1 個(gè)盤(pán)子從 A 移動(dòng)到 B,借助 C ??hanoi(n - 1, from_peg, aux_peg, to_peg); ??// 移動(dòng)第 n 個(gè)盤(pán)子從 A 到 C ??printf("移動(dòng)盤(pán)子 %d 從 %c 到 %c\n", n, from_peg, to_peg); ??// 將 n-1 個(gè)盤(pán)子從 B 移動(dòng)到 C,借助 A ??hanoi(n - 1, aux_peg, to_peg, from_peg); } int main() { ??int n; ??printf("請(qǐng)輸入盤(pán)子的數(shù)量:"); ??scanf("%d", &n); ??printf("在漢諾塔游戲中的步驟如下:\n"); ??hanoi(n, 'A', 'C', 'B'); // 從柱子 A 移動(dòng) n 個(gè)盤(pán)子到柱子 C,借助柱子 B ??return 0; }
在這個(gè)代碼中,hanoi
函數(shù)使用遞歸來(lái)解決漢諾塔問(wèn)題。主要思路是將 n-1 個(gè)盤(pán)子從 A 移動(dòng)到 B,然后移動(dòng)第 n 個(gè)盤(pán)子從 A 到 C,最后將 n-1 個(gè)盤(pán)子從 B 移動(dòng)到 C。每次移動(dòng)都會(huì)打印出移動(dòng)的盤(pán)子編號(hào)和移動(dòng)的來(lái)源與目標(biāo)柱子。
在 main
函數(shù)中,用戶(hù)輸入要移動(dòng)的盤(pán)子數(shù)量,然后調(diào)用 hanoi
函數(shù)開(kāi)始解決漢諾塔問(wèn)題。
青蛙跳臺(tái)階問(wèn)題
青蛙跳臺(tái)階問(wèn)題是一個(gè)經(jīng)典的遞歸問(wèn)題,描述了一只青蛙跳上 n 個(gè)臺(tái)階的跳法數(shù)量。每次青蛙可以跳躍 1 個(gè)臺(tái)階或 2 個(gè)臺(tái)階。要求編寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算給定 n 個(gè)臺(tái)階時(shí)青蛙的跳法數(shù)量。
這個(gè)問(wèn)題可以使用遞歸來(lái)解決。青蛙在跳上第 n 個(gè)臺(tái)階時(shí),有兩種方式:從第 n-1 個(gè)臺(tái)階跳一步,或從第 n-2 個(gè)臺(tái)階跳兩步。因此,總的跳法數(shù)量等于跳上第 n-1 個(gè)臺(tái)階和跳上第 n-2 個(gè)臺(tái)階的跳法數(shù)量之和。
以下是使用 C 語(yǔ)言編寫(xiě)的解決青蛙跳臺(tái)階問(wèn)題的代碼:
#include <stdio.h> // 計(jì)算青蛙跳上 n 個(gè)臺(tái)階的跳法數(shù)量 int jump(int n) { ??if (n <= 0) { ????return 0; // 無(wú)臺(tái)階可跳,返回 0 ?} else if (n == 1) { ????return 1; // 一個(gè)臺(tái)階,只有一種跳法 ?} else if (n == 2) { ????return 2; // 兩個(gè)臺(tái)階,有兩種跳法:1 + 1 或 2 ?} else { ????// 遞歸計(jì)算跳上 n-1 和 n-2 個(gè)臺(tái)階的跳法數(shù)量之和 ????return jump(n - 1) + jump(n - 2); ?} } int main() { ??int n; ??printf("請(qǐng)輸入臺(tái)階的數(shù)量:"); ??scanf("%d", &n); ??int ways = jump(n); ??printf("青蛙跳上 %d 個(gè)臺(tái)階的跳法數(shù)量為:%d\n", n, ways); ??return 0; }
在這個(gè)代碼中,jump
函數(shù)使用遞歸來(lái)計(jì)算跳上 n 個(gè)臺(tái)階的跳法數(shù)量。在 main
函數(shù)中,用戶(hù)輸入要跳的臺(tái)階數(shù)量,然后調(diào)用 jump
函數(shù)來(lái)計(jì)算跳法數(shù)量,并輸出結(jié)果。需要注意,遞歸解法會(huì)存在重復(fù)計(jì)算的問(wèn)題,可以通過(guò)動(dòng)態(tài)規(guī)劃或迭代來(lái)優(yōu)化。