高手请进,将本人做了很久没有做出来的题放上,给大家活动活动脑子,请帮忙!!!!

smq 2002-02-07 09:35:07
这两道题完全出于兴趣,要求不能用第归实现,第归程序我已经编出来了,但是非第归程序尚未完成,请高手指点!!!

1、传统的24点问题,我记得csdn好像讨论过,现在扩展到n个数,结果为k的情况,使用n个数+-*/()运算算出k并输出结果。

2. 分数问题,对任意数n,求出他的所有满足以下条件的组合

n = n1+n2+....+nm;
n1 >= n2 >= n3 >= ....>=nm
输出所有结果,其中m未知。
例如:4
4 = 1+1+1+1
4 = 2+1+1
4 = 3+1
4 = 4
4 = 2+2;

以上两题要求用非第归算法解决


...全文
48 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
分数的时候可以考虑GDBH猜想吧
congling 2002-02-07
  • 打赏
  • 举报
回复
其实过分追求所谓的非递归也是实在无聊。
starfish 2002-02-07
  • 打赏
  • 举报
回复
上面说的第二个问题,叫做整数拆分问题,对于整数n,其整数拆分的数目是ackman函数Ackman(n),可以证明,这个ackman函数是无法转化为迭代形式的。所以根本不存在所谓的非递归算法(用堆栈其实还是递归)
starfish 2002-02-07
  • 打赏
  • 举报
回复
用堆栈只能模拟递归调用,只不过你自己写代码实现了原来由编译器做的事情。并不能算真正的非递归。所谓非递归就是递推(或称为迭代),首先要将递归转化为尾递归,然后进一步转化为迭代。但可惜的是,有很多的递归根本不可能转化为尾递归形式(数学上可以证明),有一些具有特殊形式递归可以通过cook定理(好像是叫这个,记不太清了)转化为尾递归。具体的可以参考有关程序等价变换的资料。
congling 2002-02-07
  • 打赏
  • 举报
回复
第一条问题前已经讨论过了,第二条问题可以使用回朔解决,但是没什么意思,在这里给出第二条的程序


#define MAX_COUNT 1000
static int stack[MAX_COUNT];

void dumpStack(int count)
{
int i;
for(i=0;i<count;i++)
printf("%4d",stack[i]);
printf("\n");
}

void devide(int n)
{
int index=1,rest;
stack[0]=1;
rest=n-1;
while(stack[0]<n)
{
if(!rest)
{
dumpStack(index);
index--;
rest+=stack[index];
while(1)
{
index--;
rest+=stack[index];
stack[index]++;
if(!index||stack[index]<=stack[index-1])
{
rest-=stack[index];
index++;
break;
}
}
}
else
{
stack[index]=1;
index++;
rest--;
}
}
printf("%4d\n",n);
}

int main()
{
devide(10);
}
naturerythm 2002-02-07
  • 打赏
  • 举报
回复
其思想是用stack来将递归消除。//不好意思,废话一句。
其思想是用stack来模拟函数的调用。
naturerythm 2002-02-07
  • 打赏
  • 举报
回复
既然已经用递归做出来了,完全可以将递归化成非递归。
有固定的规则,我在清华的《数据结构》(pascal)和华中科大《计算机
算法基础》上都见到过。其思想是用stack来将递归消除。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧