激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C 語言基礎實現青蛙跳臺階和漢諾塔問題

C 語言基礎實現青蛙跳臺階和漢諾塔問題

2022-01-06 13:37吞吞吐吐大魔王 C/C++

這篇文章我們九里講講C 語言基礎實現青蛙跳臺階和漢諾塔問題,感興趣的小伙伴可以參考下面文章的具體內容

一、青蛙跳臺階

題目

一只青蛙一次可以跳上1級臺階,也可以跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法

思路

遇見題目我們可以在紙上先動手畫畫,把最簡單的幾種方式列出來,作比較,找規律。

C 語言基礎實現青蛙跳臺階和漢諾塔問題

分析

按照上面表格可以從跳法次數,過程,或者兩者結合找規律

1. 從跳法次數分析

  • 觀察表格,可以知道從n>=3時,第n個數就是前兩個數的和(與斐波那契數列一樣)
  • 我們自己推論,當臺階數為n時,設跳法有f(n)次,如果青蛙先跳1階,則剩下的臺階數為n-1,即剩余跳法有f(n-1)次;如果青蛙先跳2階,則剩下的臺階數為n-2,即剩余跳法有f(n-2)次。
  • 故跳法次數f(n)=f(n-1)+f(n-2),因為等號右邊有兩個值,故當n=1,n=2時為最后的特殊限制條件
  • 下面代碼為遞歸求法,如果想用非遞歸,可以將遞歸通項改成循環

代碼1(遞歸)

#include <stdio.h>
int jump(int n)
{
if (n == 1)
return 1;
if (n == 2)
return 2;
return jump(n - 1) + jump(n - 2);
}
int main()
{
int n;
scanf("%d", &n);
int ret = jump(n);
printf("%d", ret);
return 0;
}

2. 從過程分析

  • 觀察表格,可以知道,跳n階臺階,跳兩階臺階次數可以為0到n/2次,而每一次跳兩階臺階的順序也是不定的。可以通過計數原理的組合數C(n,m),表示從n個數中選m個數排列。n表示每次需要跳的次數,m表示一次跳兩階的次數
  • 組合數C(n,m),可以由n!/(m!*(n-m)!)求得
  • 下面代碼為非遞歸求法,如果想要寫成遞歸,可以根據循環修改

代碼2(非遞歸)

#include <stdio.h>
int fac(int m)
{
int i = 0;
int count = 1;
for (i = 1; i <= m; i++)
{
count *= i;
}
return count;
}
int jump(int n)
{
int i = 0;      //i為跳兩階臺階的次數
int sum = 0;     //sum為計算跳法
for (i = 0; i <= n / 2; i++)
{
int a = 0;
a = n - i * 2 + i;   //a為跳到n階臺階跳的次數 
sum += fac(a) / (fac(i)*fac(a - i));
}
return sum;
}
int main()
{
int n;
scanf("%d", &n);
int ret = jump(n);
printf("%d", ret);
return 0;
}

 

二、青蛙跳臺階變式1

題目

一只青蛙一次可以跳上1級臺階,也可以跳上2級臺階…也可以跳n級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法

分析

  • 根據原題推論,當臺階數為n時,設跳法有f(n)次,如果青蛙先跳1階,則剩下的臺階數為n-1,即剩余跳法有f(n-1)次;如果青蛙先跳2階,則剩下的臺階數為n-2,即剩余跳法有f(n-2)次。
  • 那么當青蛙跳3階臺階,則剩下的臺階數為n-3,即剩余跳法有f(n-3)次…當青蛙跳n階臺階,則剩下的臺階數為n-n,即剩余跳法有f(n-n)次
  • 故跳法次數f(n)=f(n-1)+f(n-2)+f(n-3)…+f(n-n)
  • 由推論可得f(n-1)=f(n-2)+f(n-3)…+f(n-n),將其代入上面式子
  • 故跳法次數為f(n)=2*f(n-1),因為等號右邊只有一個值,故n=1為最后的特殊限制條件

代碼3(遞歸)

#include <stdio.h>
int jump(int n)
{
if (n == 1)
return 1;
return 2*jump(n - 1);
}
int main()
{
int n;
scanf("%d", &n);
int ret = jump(n);
printf("%d", ret);
return 0;
}

 

三、青蛙跳臺階變式2

題目

一只青蛙一次可以跳上1級臺階,也可以跳上2級臺階…也可以跳m級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法(m<=n)

分析

  • 根據變式1推論得f(n)=f(n-1)+f(n-2)+f(n-3)…+f(n-n)
  • 而這里最多一次只能跳m階,故f(n)=f(n-1)+f(n-2)+f(n-3)…+f(n-m)
  • 由推論得f(n-1)=f(n-2)+f(n-3)…+f(n-m)+f(n-m-1),代入上面式子
  • 故跳法次數為f(n)=2*f(n-1)-f(n-m-1)
  • 因為通過遞歸n的值在減少,當n<m時,其實最多就只能跳n階,與變式1就是一樣的問題了

代碼4(遞歸)

#include <stdio.h>
int jump(int n,int m)
{
if (n > m)
return 2 * jump(n - 1, m) - jump(n - 1 - m, m);
else
{
if (n == 1)
 return 1;
return 2 * jump(n - 1, n);
}
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int ret = jump(n,m);
printf("%d", ret);
return 0;
}

 

四、漢諾塔問題(求步數)

題目

有A,B,C三個柱子,A柱子上從上到下,從小到大排列著n個圓盤。現要求將A柱子上的n個圓盤全部移動到C柱子上,依然按照從上到下,從小到大的順序排列。且對移動過程要求如下:

a)一次只能移動一個盤子。

b)移動過程中大盤子不允許出現在小盤子上方。

問:總共需要移動的步數是多少?

思路

因為求的是步數,我們可以通過找前面幾組數據,觀察是否有什么規律

C 語言基礎實現青蛙跳臺階和漢諾塔問題

分析

  • 通過表格觀察,可以知道盤子數為n時,步數為20+21+…+2n-1,即2n-1
  • 我們可以通過下面這張圖片來推論:

C 語言基礎實現青蛙跳臺階和漢諾塔問題

  • 假設盤子數量為n,通過化繁為簡思想,我們可以把盤子分成兩個部分。上面n-1個盤子,和最下面一個盤子。移動步驟如下:
  1. 將最上面的n-1個盤子移動到B柱上
  2. 將最下面的盤子移動到C柱上
  3. 再將B柱上的n-1個盤子移動到C柱上
  • 問題轉化成如何移動最上面n-1個盤子。按照上面的思路解決n-1個盤子移動的問題。
  • 假設移動n個盤子需要的步數為f(n),則移動n-1個盤子需要f(n-1)步。
  • 故移動步數為f(n)=f(n-1)+1+f(n-1),即f(n)=2*f(n-1)+1
  • 通過等比數列變形又可以得到f(n)=2n-1

代碼5(非遞歸)

#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d", &n);
int count =0;
  count=(int)pow(2,n)-1;
printf("%d", count);
return 0;
}

代碼6(遞歸)

#include <stdio.h>
int tower(int n)
{
if (n == 1)
return 1;
else
return 2 * tower(n - 1) + 1;
}
int main()
{
int n;
scanf("%d", &n);
int ret=tower(n);
printf("%d", ret);
return 0;
}

 

五、漢諾塔問題(求移動過程)

題目

有A,B,C三個柱子,A柱子上從上到下,從小到大排列著n個圓盤。現要求將A柱子上的n個圓盤全部移動到C柱子上,依然按照從上到下,從小到大的順序排列。且對移動過程要求如下:

a)一次只能移動一個盤子。

b)移動過程中大盤子不允許出現在小盤子上方。

問:打印移動的方案 (例如, 移動A柱最上面的圓盤到C柱, 則輸出"A -> C")

思路

因為求的是移動方案,所以我們可以將前幾組數據列出來,結合遞歸化簡為繁的思想找共性和非共性

C 語言基礎實現青蛙跳臺階和漢諾塔問題

分析

  • 通過觀察得到:除了n=1,n>1時,都是先將A柱上面n-1個盤子拿到B柱(粗字體為其過程),再將A柱最下面盤子拿到C柱。此時A柱變成輔助柱,再將B柱上的盤子放到C柱
  • 故將A柱最下面盤子移到C柱為中間過程
  • 上一步為將初始柱(A柱)上面n-1個盤子借助輔助柱(C柱)移到目標柱(B柱)【其實可以這里看作單獨一個n-1的漢諾塔,將A柱上的盤子移動到B柱】
  • 下一步為將初始柱(B柱)上面n-1個盤子借助輔助柱(A柱)移到目標柱(C柱)【其實可以這里看作單獨一個n-1的漢諾塔,將B柱上的盤子移動到C柱】
  • 而上一步,中間過程,下一布就是遞歸的核心思想
  • 而當n=1時,盤子數只有一個,我們將其直接放到目標柱即可(其為最終的限制條件)
  • 初始柱,輔助柱,目標柱,其實就是把該步驟的移動過程當作一個單獨的漢諾塔問題,需要移動盤子現在所在的位置為初始柱,要將其放到的位置就是目標柱

代碼7(遞歸)

#include <stdio.h>
void hanio(int n, char x, char y, char z)
{
if (n == 1)
printf("%c->%c\n",x,z);  //當盤子只剩一個時,直接打印初始柱移動到目標柱的過程
else
{
hanio(n - 1, x, z, y);  //將n-1個盤子從起始柱放到目標柱(第一次A->B,第二次B->A,后面往復)
      
printf("%c->%c\n", x, z); //打印初始柱移動到目標柱的過程
      
hanio(n - 1, y, x, z);  //將n-1個盤子從起始柱放到目標柱(第一次B->C,第二次C->B,后面往復)
}
}
int main()
{
int n;
scanf("%d", &n);
hanio(n,'A','B','C');
return 0;
}

結語:

到此這篇關于C 語言基礎實現青蛙跳臺階和漢諾塔問題的文章就介紹到這了,更多相關C 語言實現青蛙跳臺階和漢諾塔內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_51367845/article/details/116136835

 

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 一级大黄毛片 | 日本黄色一级视频 | 一区二区三区在线观看国产 | 91精品片 | 国产高清美女一级毛片久久 | 精品人成| 看免费毛片 | 91精品国产乱码久 | 娇妻被各种姿势c到高潮小说 | 欧美视频国产精品 | 性生活视频一级 | 免费激情视频网站 | 免费国产一区二区视频 | 午夜视频色 | 亚州综合网 | 免费一级毛片观看 | 91在线色| 国产午夜亚洲精品理论片大丰影院 | 偷偷草网站 | 精品中文字幕久久久久四十五十骆 | 成人不卡在线观看 | 原来神马影院手机版免费 | 精品国产一区二区三区天美传媒 | 国产精品一区在线看 | 91成人免费网站 | 中文字幕一二区 | 色网站综合| 亚洲性一区 | 成人在线观看免费视频 | 亚洲va久久久噜噜噜久久男同 | 亚洲欧美在线视频免费 | 欧美淫视频 | 午夜精品久久久久久久96蜜桃 | 日韩大片在线永久观看视频网站免费 | 欧美精品一区自拍a毛片在线视频 | 久久狂草 | 91九色精品| 久久精品亚洲一区二区三区观看模式 | 国产精品亚洲欧美一级在线 | 神马久久精品综合 | 在线观看麻豆 |