辽宁石油化工大学数据结构课件递归与广义表.pptxVIP

  • 1
  • 0
  • 约7.78千字
  • 约 61页
  • 2021-09-27 发布于河北
  • 举报

辽宁石油化工大学数据结构课件递归与广义表.pptx

递归的概念 递归过程与递归工作栈 递归与回溯 广义表;递归的概念;定义是递归的;求解阶乘 n! 的过程;数据结构是递归的;搜索链表最后一个结点并打印其数值 template class Type void Print ( ListNodeType *f ) { if ( f -link == NULL ) cout f -data endl; else Print ( f -link ); };在链表中寻找等于给定值的结点并打印其数值 template class Type void Print ( ListNodeType *f, Type x ) { if ( f != NULL ) if ( f - data == x ) cout f - data endl; else Print ( f - link, x ); }; 问题的解法是递归的 例如,汉诺塔(Tower of Hanoi)问题的解法: 如果 n = 1,则将这一个盘子直接从 A 柱移到 C 柱上。否则,执行以下三步: ① 用 C 柱做过渡,将 A 柱上的 (n-1) 个盘子移到 B 柱上: ② 将 A 柱上最后一个盘子直接移到 C 柱上; ③ 用 A 柱做过渡,将 B 柱上的 (n-1) 个盘子移到 C 柱上。;;;;;函数递归时的活动记录; long Factorial ( long n ) { int temp; if ( n == 0 ) return 1; else temp = n * Factorial (n-1); RetLoc2 return temp; };计算Fact时活动记录的内容;递归过程改为非递归过程;计算斐波那契数列的函数Fib(n)的定义;调用次数 NumCall(k) = 2*Fib(k+1) - 1。;;;;long Fibnacci ( long n ) { StackNode S; Node *w; long sum = 0; //反复执行直到所有终端结点数据累加完 do { while ( n 1 ) { w-n = n; w-tag = 1; S.push ( w ); n--; } //向左递归到底, 边走边进栈 sum = sum + n; //执行求和 ; while ( !S.IsEmpty( ) ) { w = S.getTop( ); S.Pop( ); if ( w-tag == 1 ) { //改为向右递归 w-tag = 2; S.push ( w ); n = w-n – 2; //F(n)右侧为F(n-2) break; } } } while ( !S.IsEmpty( ) ); return sum; };单向递归用迭代法实现;void recfunc ( int A[ ], int n ) { if ( n = 0 ) { cout A[n] “ ”; n--; recfunc ( A, n ); } };void sterfunc ( int A[ ], int n ) { //消除了尾递归的非递归函数 while ( n = 0 ) { cout value A[n] endl; n--; } } ;递归与回溯 常用于搜索过程;1#主对角线 3#主对角线 5#主对角线;解题思路;设置 4 个数组 col [n] :col[i] 标识第 i 列是否安放了皇后 md[2n-1] : md[k] 标识第 k 条主对角线是否安放了皇后 sd[2n-1] : sd[k] 标识第 k 条次对角线是否安放了皇后 q[n] : q[i] 记录第 i 行皇后在第几列;void Queen( int i ) { for ( int j = 0;

文档评论(0)

1亿VIP精品文档

相关文档