我有以下代碼:
#include <stdio.h>
void recursion(char *ptr) {
if(*ptr!='J') recursion(ptr );
printf("%c",*ptr);
}
void main() {
char v[]="!zenaJ";
char *ptr=v;
recursion(ptr);
}
我要歸還珍妮茲!通過遞回函式。我編譯時沒有任何錯誤。當我運行程式時,出現錯誤“分段錯誤(核心轉儲)”。我究竟做錯了什么?
uj5u.com熱心網友回復:
您正在遞回地傳遞相同的指標
if(*ptr!='J') recursion(ptr );
因為后增量運算式ptr 的值是指標在其增量之前的值。
用C寫的函式可以如下所示
void recursion( const char *ptr )
{
if ( *ptr )
{
recursion( ptr 1 );
putchar( *ptr );
}
}
在 C 中,該函式可以如下所示
std::ostream & recursion( const char *ptr, std::ostream &os = std::cout )
{
if ( *ptr )
{
recursion( ptr 1 );
os << *ptr;
}
return os;
}
注意,根據 C 標準,沒有引數的函式 main 應宣告為
int main( void )
在 C 中,它可以宣告為
int main()
uj5u.com熱心網友回復:
ptr 的增量僅在對 的遞回呼叫之后發生recursion。一個簡單的修復應該是:
#include <stdio.h>
void recursion(char *ptr) {
if (*ptr != 'J')
{
char c = *ptr;
ptr ;
recursion(ptr);
printf("%c",c);
}
else
{
printf("%c", 'J');
}
}
void main() {
char v[]="!zenaJ";
char *ptr=v;
recursion(ptr);
}
uj5u.com熱心網友回復:
我強烈建議使用深度優先搜索演算法來解決您的問題。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int maximumSize=10;
vector<int> visited(maximumSize, 0);
void depthFirstSearch(int currentIndex, int previousIndex, string input)
{
if(visited[currentIndex]==1)
{
return;
}
visited[currentIndex]=1;
for(int nextIndex=currentIndex; nextIndex<input.size(); nextIndex)
{
if(nextIndex==previousIndex)
{
continue;
}
depthFirstSearch(nextIndex, currentIndex, input);
}
cout<<input[currentIndex];
return;
}
int main()
{
string inputString="!zenaJ";
depthFirstSearch(0, -1, inputString);
return 0;
}
結果如下:
Janez!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/361322.html
