You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#include <stdio.h>
int n = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf("total:%d\n", n);
return 0;
}
def perm(list, start, end):
if(start == end):
print list
for i in range(start,end):
list[start],list[i] = list[i],list[start]
perm(list,start+1,end)
list[start],list[i] = list[i],list[start]
由24点引发的算法问题
由来:
一个人大过年的跑去看乘风破浪,还可以但是最后镜头中出现一个算24的题目——7,7,6,1.算了半天我都没有算出来,但是我是不知道到底能不能算出来于是我就准备回去写一个能算任意四个数字的24的程序。于是我在回家的路上就构思什么样的逻辑。
肯定是穷举发把所有的可能性都例出来然后等于24的就是答案,无非就是4个数字4中运算符,因为是所有情况可以完全不用考虑括号,考虑括号其实也很简单就是一个中缀到后缀的转换。
回来说干就干,然后一上手就遇到一个问题,怎么列出4个数字的所有可能,隐约感觉出来要用递归,于是在没有搜索的情况下自己就开始干起来了。
全排列——自己想出来的解法
我的是一种递归思路,想知道4个数字的全排列,知道三个数字的全排列然后拿第四个数字去插空就好了,于是说干就干写出了下面的程序:
最后整个程序是写出来了,算了一下那个7761真的不能算24.来说一下我那个程序的思路,有更好的思路欢迎来讨论。
然后最后得到了我想要的结果。
遐思:
但是我觉得我这个全排列的方法不好。不好在哪里呢?我用c语言不好实现,因为算法用js和用c实现那是不一样的用c显然更有成就感,于是我就上网去搜搜到一篇我看不懂的代码:
看了半天没看懂,最后google半天终于看到一个好的解释文章是怎么说的我来解释一下。
详细看文章说的很详细。
总结
这篇文章就是总结一下我之前在百度面试回来的感觉就是,递归的应用真的很有用重点找到return和终止条件,然后就是要好好看看算法,下一个要好好看看动态规划。
The text was updated successfully, but these errors were encountered: