首页 数据库 mysql教程 程序员面试宝典8.2典型递归问题

程序员面试宝典8.2典型递归问题

Jun 07, 2016 pm 03:31 PM
看书 程序员 递归 问题 面试

今天看书看到8.2的递归问题,自己试了一下书上的代码,感觉尚有很多bug,于是自己写了一个。 主要是书中代码只是为了递归而递归,在递归的返回处理上做的不好。 贴上自己修改过的代码,仅作为日后复习之用。。 写程序时候发现几个问题,要注意: 1.一定要为v

今天看书看到8.2的递归问题,自己试了一下书上的代码,感觉尚有很多bug,于是自己写了一个。

主要是书中代码只是为了递归而递归,在递归的返回处理上做的不好。

贴上自己修改过的代码,仅作为日后复习之用。。

写程序时候发现几个问题,要注意:

1.一定要为vector**printarr=new vector*[slen];中申请的指针数组初始化,而初始化时,使用(*p+i)不能作为左值,改用p[i]即可。。

2.发现问题:使用*(*p+i)=i;赋值,调用时只能用指针+偏移值的方式,使用数组方式调用出错,如*p[i],而使用数组方式赋值,则只能使用数组方式调用。尚不明白是不是编译器的问题,留待学习。


#include
#include
#include
#include
using namespace std;

//建立比较串s在被比较串p中位置的vector。
void PrintfArrary(char* pstr,char* sstr,vector** printarr,int plen,int slen,int pstartnum,int sstartnum)
{


    for(int i=sstartnum;i         for(int j=pstartnum;j            if(*(sstr+i)==*(pstr+j))
            (*printarr[i]).push_back(j+1);
}

//递归调用,构建序列。
void printseq(vector** printarr,int slen,vector*out,int sum){
   if(slen==0){
     for(vector::iterator i((*out).begin());i!=(*out).end();i++)
        cout        cout    }


   else
     {
         int i=sum-slen;
         if(i){
            for(vector::iterator j((*printarr[i]).begin());j!=(*printarr[i]).end();j++){
                if(*j>*((*out).end()-1)){
                    (*out).push_back((*j));
                    printseq(printarr,slen-1,out,sum);
                    (*out).erase((*out).end()-1,(*out).end());
                }
            }
         }
         else
         for(vector::iterator j((*(*printarr)).begin());j!=(*(*printarr)).end();j++){
                    (*out).push_back((*j));
                    printseq(printarr,slen-1,out,sum);
                    (*out).erase((*out).end()-1,(*out).end());
         }
   }
}

//初始化及传递数据。
void  ConnectSequence(char* pstr,char* sstr)
{
    int plen=strlen(pstr);
    int slen=strlen(sstr);


    vector** printarr=new vector*[slen];
    for(int i=0;i

       printarr[i]=new vector;
   }
    vector*out=new vector;
    PrintfArrary(pstr,sstr,printarr,plen ,slen,0,0);
    printseq(printarr,slen,out,slen);
}


int main(){
 char* a="abdbccab";
 char* b="abc";
 ConnectSequence(a,b);
 return 0;
}

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

C++ 函数的递归实现:递归深度有限制吗? C++ 函数的递归实现:递归深度有限制吗? Apr 23, 2024 am 09:30 AM

C++函数的递归深度受到限制,超过该限制会导致栈溢出错误。限制值因系统和编译器而异,通常在1000到10000之间。解决方法包括:1.尾递归优化;2.尾调用;3.迭代实现。

C++ lambda 表达式是否支持递归? C++ lambda 表达式是否支持递归? Apr 17, 2024 pm 09:06 PM

是的,C++Lambda表达式可以通过使用std::function支持递归:使用std::function捕获Lambda表达式的引用。通过捕获的引用,Lambda表达式可以递归调用自身。

C++ 函数的递归实现:递归与非递归算法的比较分析? C++ 函数的递归实现:递归与非递归算法的比较分析? Apr 22, 2024 pm 03:18 PM

递归算法通过函数自调用解决结构化的问题,优点是简洁易懂,缺点是效率较低且可能发生堆栈溢出;非递归算法通过显式管理堆栈数据结构避免递归,优点是效率更高且避免堆栈溢出,缺点是代码可能更复杂。选择递归或非递归取决于问题和实现的具体限制。

AI程序员哪家强?探索Devin、通义灵码和SWE-agent的潜力 AI程序员哪家强?探索Devin、通义灵码和SWE-agent的潜力 Apr 07, 2024 am 09:10 AM

2022年3月3日,距世界首个AI程序员Devin诞生不足一个月,普林斯顿大学的NLP团队开发了一个开源AI程序员SWE-agent。它利用GPT-4模型在GitHub存储库中自动解决问题。SWE-agent在SWE-bench测试集上的表现与Devin相似,平均耗时93秒,解决了12.29%的问题。SWE-agent通过与专用终端交互,可以打开、搜索文件内容,使用自动语法检查、编辑特定行,以及编写和执行测试。(注:以上内容为原内容微调,但保留了原文中的关键信息,未超过指定字数限制。)SWE-A

揭秘C语言的吸引力: 发掘程序员的潜质 揭秘C语言的吸引力: 发掘程序员的潜质 Feb 24, 2024 pm 11:21 PM

学习C语言的魅力:解锁程序员的潜力随着科技的不断发展,计算机编程已经成为了一个备受关注的领域。在众多编程语言中,C语言一直以来都备受程序员的喜爱。它的简单、高效以及广泛应用的特点,使得学习C语言成为了许多人进入编程领域的第一步。本文将讨论学习C语言的魅力,以及如何通过学习C语言来解锁程序员的潜力。首先,学习C语言的魅力在于其简洁性。相比其他编程语言而言,C语

C++ 函数递归详解:递归在字符串处理中的应用 C++ 函数递归详解:递归在字符串处理中的应用 Apr 30, 2024 am 10:30 AM

递归函数是一种在字符串处理中反复调用自身来解决问题的技术。它需要一个终止条件以防止无限递归。递归在字符串反转和回文检查等操作中被广泛使用。

C++ 递归进阶:理解尾递归优化及其应用 C++ 递归进阶:理解尾递归优化及其应用 Apr 30, 2024 am 10:45 AM

尾递归优化(TRO)可提高特定递归调用的效率。它将尾递归调用转换为跳转指令,并将上下文状态保存在寄存器中,而不是堆栈上,从而消除对堆栈的额外调用和返回操作,提高算法效率。利用TRO,我们可以针对尾递归函数(例如阶乘计算)进行优化,通过将tail递归调用替换为goto语句,编译器会将goto跳转移化为TRO,优化递归算法的执行。

面向初学者的 C++ 递归指南:打造基础和培养直觉 面向初学者的 C++ 递归指南:打造基础和培养直觉 May 01, 2024 pm 05:36 PM

递归是一种强大的技术,它允许函数调用自身来解决问题,在C++中,递归函数由两个关键要素构成:基本情况(确定递归何时停止)和递归调用(将问题分解为更小子问题)。通过理解基础知识并练习实战示例(如阶乘计算、斐波那契数列和二叉树遍历),您可以建立递归直觉,并自信地在代码中使用它。

See all articles