Data topic details 5 | Data

简介: 数据结构结构教程 李春葆(第五版)习题 第五章

第 5 章 递归

1. 有以下递归函数:

void fun(int n)
{    if (n==1)
        printf("a:%d\n",n);
    else
    {    printf("b:%d\n",n);
        fun(n-1);
        printf("c:%d\n",n);
    }
}

分析调用 fun(5)的输出结果。

解:调用递归函数 fun(5)时,先递推到递归出口,然后求值。这里的递归出口语句是 printf("a:%d\n",n),递推时执行的语句是 printf("b:%d\n",n),求值时执行的语句是 printf("c:%d\n",n)。调用 fun(5) 的输出结果如下:
  b:5
  b:4
  b:3
  b:2
  a:1
  c:2
  c:3
  c:4
  c:5

2. 已知 A[0..n-1]为整数数组,设计一个递归算法求这 n 个元素的平均值。

解:设avg(A,i)返回A[0..i]共i+1个元素的平均值,则递归模型如下:
avg(A,i)=A[0]              当i=0
avg(A,i)=(avg(A,i-1)*i+A[i])/(i+1)   其他情况
对应的递归算法如下:

float avg(int A[],int i)
{    if (i==0)
        return(A[0]);
    else
        return((avg(A,i-1)*i+A[i])/(i+1));
}

求 $A$[$n$]中 $n$ 个元素平均值的调用方式为:avg($A$,$n$-1)。

3. 设计一个算法求正整数 n 的位数。

解:设 $f(n$)为整数 $n$ 的位数,其递归模型如下:
$f(n)$=1          当 $n$<10 时
$f(n)=f(n/10)+1$    其他情况
对应的递归算法如下:

int fun(int n)
{    if (n<10)
        return 1;
    else
        return fun(n/10)+1;
}

4. 上楼可以一步上一阶,也可以一步上两阶。设计一个递归算法,计算共有多少种不同的走法。

解:设 $f(n)$ 表示 $n$ 阶楼梯的不同的走法数,显然 $f(1)=1$,$f(2)=2$(两阶有一步一步走和两步走 2 种走法)。$f(n-1)$ 表示 $n-1$ 阶楼梯的不同的走法数,$f(n-2)$ 表示 $n-2$ 阶楼梯的不同的走法数,对于 $n$ 阶楼梯,第 1 步上一阶有个 $f(n-1)$ 种走法,第 1 步上两阶有个 $f(n-2)$ 种走法,则 $f(n)= f(n-1)+ f(n-2)$。对应的递归算法如下:

int fun(int n)
{    if (n==1 || n==2)
        return n;
    else
        return fun(n-1)+fun(n-2);
}

5. 设计一个递归算法,利用顺序串的基本运算求串 s 的逆串。

解:经分析,求逆串的递归模型如下:
$f(s) = s$                                     若 $s=Φ$
$f(s) = Concat(f(SubStr(s,2,StrLength(s)-1))$,SubStr(s,1,1))   其他情况
  递归思路是:对于 $s$=“$s_{1}s_{2}···s_{n}$”的串,假设“$s_{2}s_{3}···s_{n}$”已求出其逆串即 $f$(SubStr($s$,2,StrLength($s$)-1)),再将 $s_{1}$(为 SubStr($s$,1,1))单个字符构成的串连接到最后即得到 $s$ 的逆串。对应的递归算法如下:

#include "sqstring.cpp" //顺序串的基本运算算法
SqString invert(SqString s)
{    SqString s1,s2;
    if (StrLength(s)>0)
    {    s1=invert(SubStr(s,2,StrLength(s)-1));
        s2=Concat(s1,SubStr(s,1,1));
    }
    else
        StrCopy(s2,s);
    return s2;
}

6. 设有一个不带表头结点的单链表 $L$,设计一个递归算法 count($L$)求以 $L$ 为首结点指针的单链表的结点个数。

解:对应的递归算法如下:

int count(LinkNode *L)
{    if (L==NULL)
        return 0;
    else
        return count(L->next)+1;
}

7. 设有一个不带表头结点的单链表 $L$,设计两个递归算法,traverse($L$)正向输出单链表 $L$ 的所有结点值,traverseR($L$)反向输出单链表 $L$ 的所有结点值。

解:对应的递归算法如下:

void traverse(LinkNode *L)
{    if (L==NULL) return;
    printf("%d ",L->data);
    traverse(L->next);
}

void traverseR(LinkNode *L)
{    if (L==NULL) return;
    traverseR(L->next);
    printf("%d ",L->data);
}

8. 设有一个不带表头结点的单链表 $L$,设计两个递归算法,del($L$,$x$)删除单链表 $L$ 中第一个值为 $x$ 的结点,delall($L$,$x$)删除单链表 $L$ 中所有值为 $x$ 的结点。

解:对应的递归算法如下:

void del(LinkNode *&L, ElemType x) {
    LinkNode *t;
    if (L == NULL) return;
    if (L->data == x) 
    {   t = L;
        L = L->next;
        free(t);
        return;
    }
    del(L->next, x);
}

void delall(LinkNode *&L, ElemType x) {
    LinkNode *t;
    if (L == NULL) return;
    if (L->data == x) {
        t = L;
        L = L->next;
        free(t);
    }
    delall(L->next, x);
}

9. 设有一个不带表头结点的单链表 $L$,设计两个递归算法,maxnode($L$)返回单链表 $L$中最大结点值,minnodel($L$)返回单链表 $L$ 中最小结点值。

解:对应的递归算法如下:

ElemType maxnode(LinkNode *L) {
    ElemType max;
    if (L->next == NULL)
        return L->data;
    max = maxnode(L->next);
    if (max > L->data) return max;
    else return L->data;
}

ElemType minnode(LinkNode *L) {
    ElemType min;
    if (L->next == NULL)
        return L->data;
    min = minnode(L->next);
    if (min > L->data) return L->data;
    else return min;
}

10. 设计一个模式匹配算法,其中模板串 $t$ 含有通配符 '*' ,它可以和任意子串匹配。对于目标串 $s$,求其中匹配模板 $t$ 的一个子串的位置('*'不能出现在 $t$ 的最开头和末尾)。

解:采用 BF 模式匹配的思路,当是 $s[i]$和 $t[j]$比较,而 $t[j]$为'*'时,取出 $s$ 中对应'*'的字符之后的所有字符构成的字符串,即 SubStr($s$,$i$+2,$s.length$-$i$-1),其中 $i$+2 是 $s$ 中对应'*'字符后面一个字符的逻辑序号。再取出 $t$ 中'*'字符后面的所有字符构成的字符串,即SubStr($t$,$j$+2,$t.length$-$j$-1),递归对它们进行匹配,若返回值大于-1,表示匹配成功,返回 $i$。否则返回-1。对应的递归算法如下:

#include "sqstring.cpp" //顺序串的基本运算算法
findpat(SqString s,SqString t)
{    int i=0,j=0,k;
    while (i<s.length && j<t.length)
    {    if (t.data[j]=='*')
        {    k=findpat(SubStr(s,i+2,s.length-i-1),SubStr(t,j+2,t.length-j-1));
            j++;
            if (k>-1)
                return i-1;
            else
                return -1;
        }
        else if (s.data[i]==t.data[j])
        {    i++;
            j++;
        }
        else
        {    i=i-j+1;
            j=0;
        }
    }
    if (j>=t.length)
        return i-1;
    else
        return -1;
}
如有侵权,请联系作者删除
目录
相关文章
|
14天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
28037 100
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
9天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
5358 15
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
8天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
3886 8
|
10天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
5084 17
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
3天前
|
应用服务中间件 API 网络安全
3分钟汉化OpenClaw,使用Docker快速部署启动OpenClaw(Clawdbot)教程
2026年全新推出的OpenClaw汉化版,是基于Claude API开发的智能对话系统本土化优化版本,解决了原版英文界面的使用壁垒,实现了界面、文档、指令的全中文适配。该版本采用Docker容器化部署方案,开箱即用,支持Linux、macOS、Windows全平台运行,适配个人、企业、生产等多种使用场景,同时具备灵活的配置选项和强大的扩展能力。本文将从项目简介、部署前准备、快速部署、详细配置、问题排查、监控维护等方面,提供完整的部署与使用指南,文中包含实操代码命令,确保不同技术水平的用户都能快速落地使用。
2493 0
|
10天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
5514 5
|
12天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7431 16
|
12天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
5057 22