遞迴演算法.

Slides:



Advertisements
Similar presentations
河內塔(Hanoi)問題.
Advertisements

計算機程式語言實習課.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
“八皇后”问题 崔萌萌 吕金华.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
C++的檔案處理 綠園.
Chapter 5 遞迴 資料結構導論 - C語言實作.
高级语言程序设计 主讲人:陈玉华.
第5章 函数与预处理 《 C语言程序设计》 (Visual C++ 6.0环境) 本章导读
Do.For.While.正三角.倒正三角.倒九九乘法表
物件導向程式設計 (Object-Oriented rogramming)
選擇排序法 通訊一甲 B 楊穎穆.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
函數(一) 自訂函數、遞迴函數 綠園.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
If … else 選擇結構 P27.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
STRUCTURE 授課:ANT 日期:2010/5/12.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
Function.
程式撰寫流程.
資料結構與演算 第一章 基本概念.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
Introduction to the C Programming Language
6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
計數式重複敘述 for 迴圈 P
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C Programming in Action
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
程式設計實習課(四) ----C 函數運用----
东北林业大学 陈宇 ACM程序设计 东北林业大学 陈宇
第九章 预处理命令.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
程式結構&語法.
資料結構與演算法 第一章 基本概念 徐熊健 資料結構與演算法 徐熊健.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
1.2 C语言程序的结构与书写规则 一、 C语言程序的总体结构
第11章 位运算 为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以她提供了实现将标志状态从标志字节中分离出来的位运算功能。 所谓位运算是指,按二进制位进行的运算。 11.1 数值在计算机中的表示 11.2.
今天, AC 你 了吗? 2019/4/21.
基本IO.
C++的檔案處理 綠園.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
輸出與輸入(I/O).
C程序设计.
第 5 章 遞迴.
C qsort.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
C++程式設計入門 變數與運算子 作者:黃建庭.
參數 實際參數(Actual parameter)與形式參數(Formal parameter)
第 二 章 遞迴(Recursion) 課程名稱:資料結構 授課老師:________ 2019/5/5.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第二章 类型、对象、运算符和表达式.
Introduction to the C Programming Language
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
挑戰C++程式語言 ──第9章 函數.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
遞迴 Recursion.
程式設計--Quick Sort 通訊一甲 B 楊穎穆.
Chapter 6 遞迴.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第18讲 从C到C++ 计算机与通信工程学院.
Programming & Language Telling the computer what to do
變數與資料型態  綠園.
Introduction to the C Programming Language
遞迴
函式庫補充資料 1.
微 處 理 機 專 題 – 8051 C語言程式設計 主題:階乘計算
隨機函數.
Presentation transcript:

遞迴演算法

遞迴演算法 程序呼叫 void tt() { } 程序呼叫時流程的轉換 SS(int data,int n) { } void SS(int data[],int n) { } SS(int data,int n) 程序呼叫時流程的轉換

遞迴演算法 直接遞迴 (direct recursion):當程序執行完成前呼叫了自己這個程序。 程序呼叫時流程的轉換 { …void SS(int data[],int n) { } void SS(int data[],int n) { } SS(int data[],int n) 程序呼叫時流程的轉換

遞迴演算法 間接遞迴 (indirect recursion) :在程序執行完成前呼叫了其它會再度引用到自己的程序。 程序呼叫時流程的轉換 void SS(int data[],int n) { yy() } void TT() { SS(int data[],int n) } void yy() { TT() } 程序呼叫時流程的轉換

遞迴演算法 在設計遞迴程式時,切記終結條件 (termination condition) 的設立,否則易造形成無窮迴圈 。 void RS() { RS(); } void RS() { RS(); } void RS() { RS(); } void RS() { RS(); }

計算階乘 階乘的計算即可用遞迴的概念詮釋,請看: 於是可以寫一個計算階乘的程序 F(int n), 它接受傳入的整數 n,傳回 n*F(n-1) int F(int n) { if (n ==1) return 1; return n*F(n-1); }

遞迴練習 輸入正整數n,輸出費氏(Fibonacci)數列的第0個至第n個。 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …

費氏(Fibonacci)數列 程式 #define ERROR -1 int Fib(int n) { if (n<0) return ERROR; // n=0 if (n==0) return 0; // n=1 if (n==1) return 1; // n>=2 return Fib(n-1)+Fib(n-2); }

費氏(Fibonacci)數列 測試程式 #include <stdio.h> #include <stdlib.h> int main() { int n, i; // Input a positive number printf("Input a positive integer:", n); scanf("%d",&n); // output Fibnacci number from 0 to n for (i=0; i<=n; i++) printf("Fib(%d)= %d \n", i, Fib(i)); // pause system("pause"); }

遞迴練習:河內塔遊戲 Hanoi Tower:十九世紀在歐洲的一個遊戲。有3根柱子, 及64個大小不同中間有洞的盤子,由上到下由小到大的置於第一根柱子裡。 現在要將這些盤子搬到第三根柱子,一樣由小到大的堆放在第三根柱子裡。 規則: 搬運的過程中,小盤子必須一直保持在大盤子的上面。 可以藉助第二根柱子來完成。

遞迴練習:河內塔遊戲 示範程式

產生排列 (Permutation)

排列(permutation) 1 12, 21 123, 132, 213, 231, 312, 321 4123, 4132, 4213, 4231, 4312, 4321 3124, 3142, 3214, 3241, 3412, 3421 2134, 2143, 2314, 2341, 2413, 2431 1234, 1243, 1324, 1342, 1423, 1432

排列(permutation) k n 1 2 3 4 1234, 1243, 1324, 1342, 1423, 1432 2134, 2143, 2314, 2341, 2413, 2431 3124, 3142, 3214, 3241, 3412, 3421 4123, 4132, 4213, 4231, 4312, 4321

產生排列演算法 void perm(char c[], int k, int n) { // 產生 c[k],...,c[n] 的所有排列 if (k == n) { // 終結條件成立時(只有1個字元)輸出此項排列 } else {// 讓c[k]固定不動,求 perm(c[],k+1,n) //讓c[k]~c[n]輪流當c[k] //產生 c[k+1],…,c[n]的所有排列 //還原 原字元順序

產生排列程式 void perm(char c[], int k, int n) { // 產生 c[k],...,c[n] 的所有排列 if (k == n) { //終結條件成立時(只有1個字元)輸出此項排列 for (int i = 0; i < n; i++) cout << c[i] << " "; cout << endl; } else { // 讓c[k]固定不動,求 perm(c[], k+1, n) for (i=k; i<n; i++) { //讓c[k]~c[n]輪流當c[k] swap(c[k], c[i]); //產生a[k+1],…,a[n]的所有排列 perm(c,k+1,n); //還原 字元順序

程式1-3 產生排列 void perm(char c[], int k, int n) { // 產生 c[k],...,c[n-1] 的所有排列 if (k == n-1) //終結條件成立時輸出此項排列 { for (int i = 0; i < n; i++) cout << c[i] << " "; cout << endl; } else // 讓c[k]固定不動,求 perm(c[], k+1, n) { for (i=k; i<n; i++){ //讓c[k]~c[n-1]輪流當c[k] char temp=c[k]; c[k]=c[i]; c[i]=temp; //產生a[k+1],…,a[n-1]的所有排列 perm(c,k+1,n); //還原原字元順序 temp=c[k]; c[k]=c[i]; c[i]=temp; } 程式1-3 產生排列

產生排列的測試程式 int main() { char a[] = {‘A', ‘B', ‘C', ‘D'}; A B D C A C B D A C D B A D C B A D B C B A C D B A D C B C A D B C D A B D C A B D A C C B A D C B D A C A B D C A D B C D A B C D B A D B C A D B A C D C B A D C A B D A C B D A B C 產生排列的測試程式 int main() { char a[] = {‘A', ‘B', ‘C', ‘D'}; cout << “A B C D 的排列:" << endl; perm(a, 0, 3); system(“pause”); return 0; }