c++ - “如何在 C++ 中不使用反向函数递归调用回文数?”
问题描述
这是一个递归函数的程序,它检查一个数字是否是回文。这里没有使用反向函数。这对我来说似乎很复杂。
我无法理解此示例中的递归代码是如何工作的。因此,我需要一个带有试运行的演示或该程序中算法的详细描述。
int onedigit(int a)
{
return (a>=0 && a<10);
}
bool isPalUtil(int num, int *duplicate)
{
if(onedigit(num))
return (num == (*duplicate)%10);
if(!isPalUtil(num/10, duplicate))
return false;
*duplicate /= 10;
return (num%10 == (*duplicate)%10);
}
int isPal(int x)
{
if(x < 0)
x = -x;
int *dup = new int(x);
return isPalUtil(x,dup);
}
解决方案
首先考虑会发生什么num
:
当您进行递归调用时,您会删除最低有效数字。你一直这样做,直到你只剩下最重要的数字。
当您从递归调用返回时,将恢复先前“删除”的数字。
让下面的每一行新行代表一个调用/返回然后num
会做:
num:
12321 // Call path
1232
123
12
1 // Now the return path starts
12
123
1232
12321
当只剩下一位时,将其与副本的最低有效位进行比较,并开始返回路径。
在返回路径中,重复的最低有效数字(即刚刚匹配的那个)被删除,并完成新最低有效数字的比较。这样,结果比较就像“反向”比较。
所以num
会这样做:
num: *duplicate:
12321 12321
1232 12321
123 12321
12 12321
1 12321 // Compare least significant of both
12 1232 // Compare least significant of both
123 123 // Compare least significant of both
1232 12 // Compare least significant of both
12321 1 // Compare least significant of both
注意:
该算法的一个重要部分num
是按值传递,以便在返回后恢复它的值 whileduplicate
是一个指针,从而允许所有级别的递归更改指向的值。
失败案例的示例如下所示:
num: *duplicate:
123421 123421
12342 123421
1234 123421
123 123421
12 123421
1 123421 // Compare least significant of both
12 12342 // Compare least significant of both
123 1234 // Compare least significant of both
^ ^
Compare fails so false will be returned all the way up
所以在返回路径中,最低有效位num
是从左到右的原始数字的数字,而重复的最低有效数字是从右到左的原始数字的数字。
因此,通过比较返回路径中的最低有效数字,算法可以检查该数字是否为回文。
推荐阅读
- angular - 如何专注于离子输入
- vb.net - System.Diagnostics.Process.Start() 没有正确打开 .exe 文件?
- grafana - Grafana 文本面板 - 删除白条?
- google-cloud-run - 为什么我的云运行 eventarc 触发器失去了它的主题订阅?
- bluetooth - 使用蓝牙 5.1 进行双向测向 - 可以吗?
- go - 如何在没有默认值的情况下使选择案例在 for 循环中不阻塞
- r - Google Colab - visNetwork 不显示任何内容
- security - Blazor Web Assembly 安全性 - 已下载应用程序 DLL
- reactjs - React 中的状态初始化是如何工作的?
- snowflake-cloud-data-platform - 为什么 snowsql 不打开外部浏览器?