首頁 資料庫 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:45 AM

尾遞歸最佳化(TRO)可提高特定遞歸呼叫的效率。它將尾遞歸呼叫轉換為跳轉指令,並將上下文狀態保存在暫存器中,而不是堆疊上,從而消除對堆疊的額外呼叫和返回操作,提高演算法效率。利用TRO,我們可以針對尾遞歸函數(例如階乘計算)進行最佳化,透過將tail遞歸呼叫替換為goto語句,編譯器會將goto跳轉移化為TRO,最佳化遞歸演算法的執行。

C++ 函式遞歸詳解:遞迴在字串處理中的應用 C++ 函式遞歸詳解:遞迴在字串處理中的應用 Apr 30, 2024 am 10:30 AM

遞歸函數是一種在字串處理中反覆呼叫自身來解決問題的技術。它需要一個終止條件以防止無限遞歸。遞歸在字串反轉和回文檢查等操作中被廣泛使用。

C++ 函式遞歸詳解:尾遞歸最佳化 C++ 函式遞歸詳解:尾遞歸最佳化 May 03, 2024 pm 04:42 PM

遞歸定義及最佳化:遞歸:函數內部呼叫自身,解決可分解為更小子問題的難題。尾遞歸:函數進行所有計算後才進行遞歸調用,可最佳化為循環。尾遞歸最佳化條件:遞歸呼叫為最後操作。遞歸呼叫參數與原始呼叫參數相同。實戰範例:計算階乘:輔助函數factorial_helper實現尾遞歸最佳化,消除呼叫棧,提高效率。計算斐波那契數列:尾遞歸函數fibonacci_helper利用最佳化,高效率計算斐波那契數。

See all articles